我有用C#編寫的實用程序來與我們的USB設備來回通信。我們使用通用HID驅動程序,並在FileStream
對象中將手柄包裝到設備中。我使用BeginRead
和BeginWrite
方法讀/寫數據,這不是因爲我需要異步IO,而是因爲我可以在設備進入非通信狀態(有意或無意)情況下超時。所有讀/寫操作都是在我自己的專用IO線程中完成的。過早中止BeginRead和BeginWrite的正確方法?
我很擔心我沒有正確地做事,因爲我已經看到了一些我懷疑是線程死鎖的情況。這裏是我的相關Read
方法(這似乎工作得很好)的精簡版。
if (_readResult == null)
{
_readResult = _deviceStream.BeginRead(_readBuffer, 0, _readBuffer.Length, null, null);
}
if (_readResult.AsyncWaitHandle.WaitOne(IOTimeout, true))
{
int bytesRead = _deviceStream.EndRead(_readResult);
_readResult.AsyncWaitHandle.Close();
_readResult= null;
// … Copy bytes to another buffer
}
else
{
// … Timeout, so retry again in a bit
}
我的主要問題是如何正確地停止未完成BeginRead
或BeginWrite
電話,如果我需要終止我的IO線程和我的設備不再進行通信。我不能只撥打EndRead
,因爲它會坐在那裏永遠阻止。讀/寫操作正在等待時,撥打Filestream.Close
是否安全?
我也必須問,掛起的讀寫操作是否可以同時運行?例如,如果我的讀取方法超時,我還可以繼續並嘗試寫入內容嗎?
很難重現我當前的死鎖問題,但真正奇怪的部分是它似乎開始時,IO線程「卡住」我的閱讀方法。我不確定這會如何發生,除非我的代碼不按我認爲的方式工作。