我想改一下我剛纔的問題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 ......或者一個插座,一個任務模式?
爲什麼它比使用單線程每插座模型更好?從文章中不清楚'Socket.Select'更好...... – javapowered 2012-03-16 10:52:16
嗯,因爲你沒有每個socket的線程。線程是昂貴的,在你的情況下,大多數時候他們只是等待套接字。無需額外線程即可獲得相同的I/O性能。 – zmbq 2012-03-16 11:48:59