正确的方法提前中止BeginRead和BeginWrite?

我有一个用C#编写的实用程序来与我们的USB设备进行通信。 我们使用通用的HID驱动程序,并将一个句柄包装到FileStream对象中的设备中。 我使用它的BeginReadBeginWrite方法来读/写数据,这不是因为我需要asynchronousIO,而只是为了在设备进入非通信状态(有意或无意)时超时。 所有的读写操作都是在我自己的专用IO线程中完成的。

我担心我没有做好正确的事情,因为我已经看到了一些我怀疑是线程死锁的情况。 这是我的相关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线程在我的读取方法中“卡住”时似乎开始。 我不知道如何,除非我的代码不工作,我认为是这样的。

没有内置的取消。 关闭流是推荐的解决方案。 只要确保在调用EndRead时捕获异常…

如果您想使用.NET 4.5,则支持取消的新FileStream.ReadAsync : http : //msdn.microsoft.com/en-us/library/hh158566( v = vs.110 )