- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个用 C# 编写的实用程序,用于与我们的 USB 设备来回通信。我们使用通用 HID 驱动程序并将设备句柄包装在 FileStream
对象中。我使用它的 BeginRead
和 BeginWrite
方法读取/写入数据,不是因为我需要异步 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 线程并且我的设备不再通信,如何正确停止未完成的 BeginRead
或 BeginWrite
调用。我不能只调用 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/
这个小项目背后的想法是开发一个不同的聊天应用程序,我想发送对象而不是纯字符串。到目前为止,这就是我所拥有的。 如果我在构造函数上反序列化,它工作得很好(UserDTO 目前只有 2 个字符串字段),但
我正在尝试写一个 TcpClient执行。我想在处理数据时开始下一次读取,但我不确定何时将字节数组传递给 BeginRead被修改。这是我当前的实现 private void ProcessData(
我无法找到在成功的 HttpWebRequest 后取消/终止异步读取操作的方法。无法设置超时,ThreadPool.RegisterWaitForSingleObject 也不起作用。并且关闭底层套
关于这篇文章: http://msdn.microsoft.com/en-us/library/system.net.security.sslstream.beginread.aspx 是否有关于如何
我需要从我的虚拟 com 端口读取数据并检测消息“Dreq”。一旦我按下连接按钮,它就会连接到我的 COM8 端口并开始读取新线程。我还有一个断开连接按钮,我希望在其中关闭读数并断开与 COM8 端口
我正在用 TcpClient 编码一个服务器/客户端项目和 NetworkStream对象。我希望许多客户端连接到服务器,这些客户端存储在 List<> 中定制NetworkNode对象,每个对象都有
我正在编写一个类,该类公开流的一部分以供阅读。由于可能同时从多个不同的子部分读取数据,因此在任何时候只能进行一个操作。 我想到了在每次操作之前锁定底层流。在 BeginRead 调用周围锁定流是否足以
我正在运行一个有 5000 个 UdpClient 实例的应用程序类,因为我需要在不同的端口上同时传输数据包。 我目前正在使用 System.Timers.Timer ,它在 ThreadPool 上
有一个异步服务器的代码。 Client 发送 Header - Data Block + Data Block 的大小。 服务器首先异步读取Header,然后读取Data Block。 我需要在读取数
好的,我想连接到 Socket 并使用 System.Net.Sockets.NetworkStream 类读取网络流。这是我目前所拥有的: NetworkStream myNetworkStream
使用 .NET TcpClient 如果我在关联的网络流上调用了异步 BeginRead(),我仍然可以调用 Write()在另一个线程的那个流上? 或者我是否必须 lock() 从 BeginRea
假设我有一个流链,执行压缩 -> 加密 -> 文件 I/O。 在 C# 中,使用同步 I/O,它看起来像这样: int n=0; byte[] buffer= new byte[2048];
运行这段代码时: private async void StartChat(Object obj) { TcpClient me = (TcpClient)obj; UpdateCha
当使用异步代码通过 BeginXXX/EndXXX 模式从流等中读取时,我相信在调用 EndXXX 时会抛出在此过程中发生的任何异常。 这是否意味着对 BeginXXX 的初始调用永远不会抛出异常,它
我有一个用 C# 编写的实用程序,用于与我们的 USB 设备来回通信。我们使用通用 HID 驱动程序并将设备句柄包装在 FileStream 对象中。我使用它的 BeginRead 和 BeginWr
我还不太“了解”async 和 await,我正在寻找关于我将要解决的特定问题的一些说明。基本上,我需要编写一些代码来处理 TCP 连接。它基本上只是接收数据并处理它,直到连接关闭。 我通常使用 Ne
它在 MSDN documentation 中声明那: at the very minimum, your state parameter must contain the connected or
为什么使用 FileOptions.Asynchronous 创建 FileStream 会导致 FileStream.BeginRead 阻塞调用线程? 这是代码片段: private static
我创建了 ReadByteContainer 来存储当前数据,并创建了 ReadByteAsyncCallback 用于回调。是否有更好的替代方案? HRESULT MediaByte
我实现了一个模拟串行端口的 DataReceived 事件的系统,通过使用 BeginRead() 方法触发从 TCPClient 对象的 NetworkStream 读取数据,如下所示: TcpCl
我是一名优秀的程序员,十分优秀!