2014-10-10 100 views
-1

如何打斷c#中的Socket.Select?如何中斷Socket.Select

在C中,我使用了「自我管道」技巧或「信號」。

在C#我知道我可以創建一個套接字對並中斷選擇,但它似乎不是很乾淨。

有什麼更好的,我可以做,以中斷在C#中的選擇呼叫。

+2

'有什麼更好的我可以做',比什麼都好?顯示你的代碼,讓人們可以想到一個未知數。在這種形式下,你不清楚你在問什麼...... – I4V 2014-10-18 21:43:46

+1

查看你到目前爲止的答案數量(即使有獎金)。你怎麼看?是否因爲SO用戶無法或您的問題質量不佳? – I4V 2014-10-20 19:58:12

+2

答案很簡單:沒有其他(便攜)方式。你必須添加一個你可以控制的套接字來中斷選擇(這就像自管式的技巧)。僅Windows解決方案將P /調用一些WSA ... – firda 2014-10-22 20:21:09

回答

-1

您是否嘗試過使用Select函數的最後一個參數(int microSeconds)。它作爲超時服務器(-1 =沒有超時)。

+1

我正在使用-1沒有超時,這不是問題,我試圖中斷選擇,所以超時被中斷。 回到C中,沒有真正的解決方案來中斷它,除了諸如自管道或信號之類的拙劣方法之外。我想知道是否c#有任何新功能來做到這一點,而不使用任何「哈克」。 – Xela 2014-10-10 01:27:22

+0

我不確定要了解您要做什麼... – 2014-10-10 01:28:27

+0

http://stackoverflow.com/questions/3333361/how-to-cancel-waiting-in-select-on-windows閱讀此內容,除此之外的其他問題除外在C#中,C解決方案非常簡單。 – Xela 2014-10-10 01:29:47

0

爲了解決這個問題,我只需撥打我在Socket.Select()調用中列出的插座上的Socket.Close()即可。這會中斷select,但有一個例外。

我會使用套接字對技巧,但我無法在.net中找到等效於pipe()。我有一種感覺,我在某處讀到,在Windows上執行此操作的方式是通過TCP連接到環回(特別是因爲WSA的select()不支持「普通」文件描述符)。但是,這看起來更骯髒,更容易發生不良事情,而不僅僅是關閉來自不同線程的監聽套接字,並使Socket.Select()被異常中斷。

0

我遇到了同樣的問題。最好的選擇是在不同的線程上運行選擇。

這幫助我擺脫了異常錯誤。