我正在開發一個Windows窗體應用程序,對通過USB連接的設備執行少量操作。對於像讀,寫和其他所有操作,我們有一個自定義庫。阻止阻塞的線程阻塞
寫入操作在用戶點擊按鈕時完成。
要讀取,創建一個單獨的線程。可用庫的問題是Read調用被阻塞並且具有INFINITE超時。
在連接失敗的情況下,這個線程在Read函數調用時會陷入困境,因爲這個函數只有在它接收到數據時纔會中斷。
在這種情況下殺死這個線程的方法是什麼? Thread.Abort()不起作用。
我正在使用C#編程。
我正在開發一個Windows窗體應用程序,對通過USB連接的設備執行少量操作。對於像讀,寫和其他所有操作,我們有一個自定義庫。阻止阻塞的線程阻塞
寫入操作在用戶點擊按鈕時完成。
要讀取,創建一個單獨的線程。可用庫的問題是Read調用被阻塞並且具有INFINITE超時。
在連接失敗的情況下,這個線程在Read函數調用時會陷入困境,因爲這個函數只有在它接收到數據時纔會中斷。
在這種情況下殺死這個線程的方法是什麼? Thread.Abort()不起作用。
我正在使用C#編程。
你的Read方法可能調用本地代碼,所以線程無法中止。沒有辦法(至少我熟悉)放棄使用COM互操作的線程。你可以看看爲什麼Read方法阻塞線程在第一位。嘗試在調用Read方法之前檢查需求。
在這個問題請看:Abort call to unmanaged DLL
在一個單獨的過程中運行它是我正在考慮的。我也在想你可能可以在另一個應用程序域中運行危險代碼,我認爲你也許能夠「在腦中投籃」,但是......它也遭遇了同樣的失敗,以便中止線程問題,請參閱: http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx –
感謝您的想法!但是如何在不同的進程中只運行一個線程?或者作爲一個不同的進程運行一個函數? – Swanand
您可以創建另一個應用程序來處理COM互操作(USB通信)並將該應用程序作爲進程啓動。然後,您可以通過Pipes與該進程進行通信http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx –
如果「自定義庫」不提供*任何*意味着取消了失敗的連接上閱讀阻擋,你應該把它扔掉,並使用不同的東西,說實話。 – Clemens
我知道....我希望我可以...但與C#的默認串行端口類的情況相同...如果將Timeout設置爲Infinte,則讀操作將卡在失敗的連接上。 – Swanand
你可以嘗試關閉「句柄」,無論你試圖讀取什麼...然後讀取將被取消我應該猜測...和你的線程取決於它如何寫入可能會退出。 –