2012-08-02 58 views
4

我有用C#編寫的實用程序來與我們的USB設備來回通信。我們使用通用HID驅動程序,並在FileStream對象中將手柄包裝到設備中。我使用BeginReadBeginWrite方法讀/寫數據,這不是因爲我需要異步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 
} 

我的主要問題是如何正確地停止未完成BeginReadBeginWrite電話,如果我需要終止我的IO線程和我的設備不再進行通信。我不能只撥打EndRead,因爲它會坐在那裏永遠阻止。讀/寫操作正在等待時,撥打Filestream.Close是否安全?

我也必須問,掛起的讀寫操作是否可以同時運行?例如,如果我的讀取方法超時,我還可以繼續並嘗試寫入內容嗎?

很難重現我當前的死鎖問題,但真正奇怪的部分是它似乎開始時,IO線程「卡住」我的閱讀方法。我不確定這會如何發生,除非我的代碼不按我認爲的方式工作。

回答