c# - 过早中止 BeginRead 和 BeginWrite 的正确方法?

标签 c# .net windows io usb

我有一个用 C# 编写的实用程序,用于与我们的 USB 设备来回通信。我们使用通用 HID 驱动程序并将设备句柄包装在 FileStream 对象中。我使用它的 BeginReadBeginWrite 方法读取/写入数据,不是因为我需要异步 IO,而是因为我可以超时以防设备进入不可通信状态(有意或不是)。所有读/写都在我自己的专用 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
}

我的主要问题是如果我需要终止我的 IO 线程并且我的设备不再通信,如何正确停止未完成的 BeginReadBeginWrite 调用。我不能只调用 EndRead,因为它会坐在那里永远阻塞。在读/写操作挂起时调用 Filestream.Close 是否安全?

我还要问一下,挂起的读写操作同时运行是否安全?比如我的read方法超时了,我还能继续写东西吗?

很难重现我当前的死锁问题,但真正奇怪的部分是当 IO 线程在我的读取方法中“卡住”时它似乎开始了。除非我的代码没有按照我认为的方式工作,否则我不确定这会如何发生。

最佳答案

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

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

关于c# - 过早中止 BeginRead 和 BeginWrite 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11785735/

相关文章:

linux - 从 Windows 通过 SSH 更新 Linux 服务器

c# - .ToList() 线程安全

windows - 如何从 Windows Vista Complete PC 备份中提取文件?

C# 在编辑数据网格时更新 MySQL 表不起作用

c# - 如何转换为 List<IEnumerable<XElement>>

c# - 使用生成的 Golang DLL 返回字符串或 *C.Char

c# - 线程池 : Cross-thread operation not valid.

windows - C++ 获取当前用户的 session 名称、IP 地址、已安装操作系统的名称和该操作系统的版本

c# - Crystal 报表。使用 MVC 的 Windows Server 2008 中的 "cannot find the path specified"

c# - 尝试将行添加到数据表时线程进入等待或 sleep 状态