2016-05-13 48 views
0

我正在使用C#編寫P2P應用程序。 這是一個帶有文件分割和文本聊天的文件傳輸。兩個線程在同一個列表上工作

客戶端有2個線程,1個用於監聽,1個用於發送。 當我發送一個文件時,它首先被分成10個部分,這10個部分被添加到客戶端的發送隊列中,然後開始發送文件塊1. 但是現在我想通過相同的管道發送消息。 然後我的想法是將該消息插入到文件塊2之前的發送列表中。 2個線程需要使用哪種線程才能在同一個列表上工作? 我已經說明了這樣收到的對象。

我的發送功能最初的想法是這些方針的東西:

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

回答

0

你可以使用一個互斥體,防止競爭條件或同步讀/寫,以相同的文件這樣Synchronization Object。基本上只有1個線程將能夠訪問該對象。

如果數據對於線程是全局數據並且它們都是一次處理的,則可以使用同步對象來簡單指示何時使用全局共享數據以及何時不使用全局共享數據。除此之外,使用共享的全局數據是完全一樣的,你只是販運它的使用。

+0

就像一個叫'ItemInUse'的'bool'的標誌。該對象需要等待訪問它並使用同步對象。您的應用程序的實際數據不會。簡單地說,如果'ItemInUse'爲false,將其設置爲true,然後對數據進行任何操作,然後在完成時將其設置爲false。 –

+0

隊列是發送者線程本地的,然後線程2將新對象添加到發送隊列中。但我不能這樣做,因爲你說它是一個同時讀/寫,但沒有辦法添加一個新的對象發送塊1完成後? – BoinQ

相關問題