2012-08-23 215 views
5

我正在開發一個Windows窗體應用程序,對通過USB連接的設備執行少量操作。對於像讀,寫和其他所有操作,我們有一個自定義庫。阻止阻塞的線程阻塞

寫入操作在用戶點擊按鈕時完成。

要讀取,創建一個單獨的線程。可用庫的問題是Read調用被阻塞並且具有INFINITE超時。

在連接失敗的情況下,這個線程在Read函數調用時會陷入困境,因爲這個函數只有在它接收到數據時纔會中斷。

在這種情況下殺死這個線程的方法是什麼? Thread.Abort()不起作用。

我正在使用C#編程。

+1

如果「自定義庫」不提供*任何*意味着取消了失敗的連接上閱讀阻擋,你應該把它扔掉,並使用不同的東西,說實話。 – Clemens

+0

我知道....我希望我可以...但與C#的默認串行端口類的情況相同...如果將Timeout設置爲Infinte,則讀操作將卡在失敗的連接上。 – Swanand

+0

你可以嘗試關閉「句柄」,無論你試圖讀取什麼...然後讀取將被取消我應該猜測...和你的線程取決於它如何寫入可能會退出。 –

回答

1

你的Read方法可能調用本地代碼,所以線程無法中止。沒有辦法(至少我熟悉)放棄使用COM互操作的線程。你可以看看爲什麼Read方法阻塞線程在第一位。嘗試在調用Read方法之前檢查需求。

在這個問題請看:Abort call to unmanaged DLL

+0

在一個單獨的過程中運行它是我正在考慮的。我也在想你可能可以在另一個應用程序域中運行危險代碼,我認爲你也許能​​夠「在腦中投籃」,但是......它也遭遇了同樣的失敗,以便中止線程問題,請參閱: http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx –

+0

感謝您的想法!但是如何在不同的進程中只運行一個線程?或者作爲一個不同的進程運行一個函數? – Swanand

+0

您可以創建另一個應用程序來處理COM互操作(USB通信)並將該應用程序作爲進程啓動。然後,您可以通過Pipes與該進程進行通信http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx –