如何打斷c#中的Socket.Select?如何中斷Socket.Select
在C中,我使用了「自我管道」技巧或「信號」。
在C#我知道我可以創建一個套接字對並中斷選擇,但它似乎不是很乾淨。
有什麼更好的,我可以做,以中斷在C#中的選擇呼叫。
如何打斷c#中的Socket.Select?如何中斷Socket.Select
在C中,我使用了「自我管道」技巧或「信號」。
在C#我知道我可以創建一個套接字對並中斷選擇,但它似乎不是很乾淨。
有什麼更好的,我可以做,以中斷在C#中的選擇呼叫。
您是否嘗試過使用Select
函數的最後一個參數(int microSeconds
)。它作爲超時服務器(-1 =沒有超時)。
我正在使用-1沒有超時,這不是問題,我試圖中斷選擇,所以超時被中斷。 回到C中,沒有真正的解決方案來中斷它,除了諸如自管道或信號之類的拙劣方法之外。我想知道是否c#有任何新功能來做到這一點,而不使用任何「哈克」。 – Xela 2014-10-10 01:27:22
我不確定要了解您要做什麼... – 2014-10-10 01:28:27
http://stackoverflow.com/questions/3333361/how-to-cancel-waiting-in-select-on-windows閱讀此內容,除此之外的其他問題除外在C#中,C解決方案非常簡單。 – Xela 2014-10-10 01:29:47
您是否試過使用Socket Shutdown?
http://msdn.microsoft.com/en-us/library/system.net.sockets.socketshutdown(v=vs.110).aspx
socket.Shutdown(SocketShutdown.Both);
希望這可以幫助你。
爲了解決這個問題,我只需撥打我在Socket.Select()
調用中列出的插座上的Socket.Close()
即可。這會中斷select,但有一個例外。
我會使用套接字對技巧,但我無法在.net中找到等效於pipe()
。我有一種感覺,我在某處讀到,在Windows上執行此操作的方式是通過TCP連接到環回(特別是因爲WSA的select()
不支持「普通」文件描述符)。但是,這看起來更骯髒,更容易發生不良事情,而不僅僅是關閉來自不同線程的監聽套接字,並使Socket.Select()
被異常中斷。
我遇到了同樣的問題。最好的選擇是在不同的線程上運行選擇。
這幫助我擺脫了異常錯誤。
'有什麼更好的我可以做',比什麼都好?顯示你的代碼,讓人們可以想到一個未知數。在這種形式下,你不清楚你在問什麼...... – I4V 2014-10-18 21:43:46
查看你到目前爲止的答案數量(即使有獎金)。你怎麼看?是否因爲SO用戶無法或您的問題質量不佳? – I4V 2014-10-20 19:58:12
答案很簡單:沒有其他(便攜)方式。你必須添加一個你可以控制的套接字來中斷選擇(這就像自管式的技巧)。僅Windows解決方案將P /調用一些WSA ... – firda 2014-10-22 20:21:09