2016-05-13 20 views
0

Ich arbeite an einer P2P-Anwendung in C#. Es ist eine Dateiübertragung mit einer Dateiaufteilung und Text-Chat.Zwei Threads arbeiten auf der gleichen Liste

Auf einem Client gibt es 2 Threads, 1 zum Abhören, 1 zum Senden. Wenn ich eine Datei sende, wird sie zuerst in etwa 10 Teile aufgeteilt, diese 10 Teile werden zu einer Sendewarteschlange im Client hinzugefügt, dann beginnt sie den Dateiblock 1 zu senden. Aber jetzt möchte ich eine Nachricht über dieselbe Pipe senden . Meine Idee ist dann, diese Nachricht in die Sendeliste vor Datei Chunk 2 einzufügen. Welche Art von Threading brauche ich für 2 Threads auf der gleichen Liste arbeiten? Ich habe die auf diese Weise empfangenen Objekte berücksichtigt.

Meine erste Idee für die Sendefunktion war etwas in diese Richtung:

public void Send() 
{ 
    while (IsConnected()) 
    { 
     if (unSentObjects.Count > 1) 
     { 
      Task sendTask = new Task(() => SendObj(unSentObjects[0])); 
      sendTask.Start(); 
     } 
    } 
} 

Antwort

0

Sie könnten einen Synchronization Object wie ein Mutex verwenden, um Race Conditions oder gleichzeitige Schreib-/Lese zu derselben Datei zu verhindern. Grundsätzlich kann nur 1 Thread auf das Objekt zugreifen.

Wenn die Daten für die Threads global sind und alle einmal verarbeitet werden, können Sie das Synchronisationsobjekt verwenden, um einfach zu signalisieren, wann globale gemeinsame Daten verwendet werden sollen und wann nicht. Anders als bei der Verwendung der freigegebenen globalen Daten ist es genau das gleiche, Sie werden nur die Verwendung von es Trafficking.

+0

Wie eine Flagge, die ein 'bool' heißt' ItemInUse'. Dieses Objekt muss auf den Zugriff warten und verwendet Synchronisationsobjekte. Die tatsächlichen Daten für Ihre Anwendung nicht. Wenn "ItemInUse" den Wert false hat, setzen Sie es auf "true" und führen Sie dann mit den Daten aus, was immer Sie möchten. Wenn Sie fertig sind, setzen Sie es erneut auf "false". –

+0

Die Warteschlange ist lokal für den Absender-Thread, dann fügt Thread 2 der sendenden Warteschlange neue Objekte hinzu. Aber ich kann das nicht tun, weil du sagst, dass es simultanes Lesen/Schreiben ist, aber gibt es keine Möglichkeit, ein neues Objekt hinzuzufügen, nachdem es Chunk 1 gesendet hat? – BoinQ

Verwandte Themen