2012-03-15 79 views
0

我想改一下我剛纔的問題Should I replace all my "new Thread" with "Task.Factory.StartNew"?如何在多線程方面接收來自多個套接字的數據?

我要聽好UDP套接字

................ 
s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
........ 

public void Receive() 
{ 
    byte[] buffer = new byte[65536]; 
    while (true) 
    { 
     try 
     { 
      count = s.Receive(buffer); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
      return; 
     } 
     if (count > 0) 
     { 
      OnNewDatagram(new NewDatagramEventArgs(buffer, count)); 
     } 
    } 
} 

所以我需要推出幾款「接收()」方法(每個插座)。 現在我使用一個線程一個插座:

socketA = new... 
.... 
threadA = new Thread(Receive); 
..... 
threadA.Start(); 

socketB = new... 
.... 
threadB = new Thread(Receive); 
..... 
threadB.Start(); 

我應該用什麼:

  • 一個線程一個插座
  • 一個線程用於所有插座
  • (如何?)一個任務適用於所有插座
  • 一個插座的任務
  • 其他?

UPD我只有2-3個插槽,因此它可能是最好使用一個插座,一個線程模型而不是Socket.Select ......或者一個插座,一個任務模式?

回答

1

您應該使用Socket.Select在多個套接字上等待並處理其中任何一個上的傳入數據。

+0

爲什麼它比使用單線程每插座模型更好?從文章中不清楚'Socket.Select'更好...... – javapowered 2012-03-16 10:52:16

+0

嗯,因爲你沒有每個socket的線程。線程是昂貴的,在你的情況下,大多數時候他們只是等待套接字。無需額外線程即可獲得相同的I/O性能。 – zmbq 2012-03-16 11:48:59

0

我看到它的方式,你應該爲每個套接字使用一個新的線程,因爲如果你對所有的套接字使用相同的線程,你只會得到一個流,即第一個。

相關問題