微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我担心我没有做好正确的事情,因为我已经看到了一些我怀疑是线程死锁的情况。 这是我的相关Read方法(这似乎工作得很好)的精简版本。

if (_readResult == null) { _readResult = _deviceStream.BeginRead(_readBuffer,_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是否安全?

我也必须问,是否有挂起的读写操作同时运行是安全的? 例如,如果我的读取方法超时,我仍然可以继续尝试写一些东西吗?

如何测量文件(硬盘)I / O的特性?

如何在Windows上编码C#但在Linux上运行?

确定WindowsIdentity实例的嵌套组

检查SuspendLayout

无法findtypes或命名空间“Mono”

我很难再现当前的死锁问题,但真正奇怪的部分是,当IO线程在我的读取方法中“卡住”时似乎开始。 我不知道如何,除非我的代码不工作,我认为是这样的。

HttpWebRequest似乎没有发送客户端SSL证书

如何使用WinAPI以快速方式逐个像素地处理图像?

蓝牙服务器应用程序接受移动设备的连接

C# – 如何获得鼠标点击命令行EXE不使用WINFORM

如何检查NotifyIcon是否隐藏

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐