我有一個服務器應用程序正在偵聽System.Net.Sockets.Socket
。它阻止Socket.Accept()
,捆綁線程。什麼是放棄線程控制的好方法,但是會將計算結果傳遞給調用客戶端?如何避免在等待請求時阻塞.NET線程
服務器代碼,有些清理,看起來是這樣的:
void ManeLupe(Socket socket)
{
for (;;)
{
Socket client = null;
NetworkStream stm = null;
try
{
client = socket.Accept(); // Blocks thread
stm = new NetworkStream(client);
var response = ProcessRequest(stm); // this could take a while
WriteResponse(response, stm);
}
catch (Exception ex)
{
LogError(client, ex);
}
finally
{
if (stm != null) stm.Dispose();
if (client != null) client.Dispose();
}
}
}
我的約束,目前是該代碼必須在.NET Framework 3.5的運行,所以我不能把優勢新的Task<>
和async
善良。坦率地說,我對通常的異步編程比較陌生,我懷疑它會成爲這個查詢的答案。
'AcceptAsync'也能發揮作用。 – 2014-10-01 17:56:11
@CoryNelson是的,沒錯。我個人不喜歡那個事件(EAP)模型。我會將其添加到我的答案中,謝謝。 – 2014-10-01 17:59:48
的確,取決於用途。對於perf,AcceptAsync是低級的。當然,APM在可用性方面並不是很好。 – 2014-10-01 18:00:47