C# 使用BaseStream在串行COM端口IO应用程序中强制终止BeginWrite

C# 使用BaseStream在串行COM端口IO应用程序中强制终止BeginWrite,c#,serial-port,C#,Serial Port,我有一个C#程序,它使用 内置SeralPort类。但是,我想做异步写入 为此,我使用BaseStream.BeginWrite()。在异步回调中 我调用BaseStream.EndWrite()。这一切都很好。然而,有时 我想在BeginWrite()完成调用之前关闭一个端口 只要BeginWrite()挂起,Close()就会使其挂起。 我尝试过调用EndWrite(),但如果调用BeginWrite()也会挂起 正在等待。如何终止BeginWrite()线程?似乎有 没有BaseStrea

我有一个C#程序,它使用 内置SeralPort类。但是,我想做异步写入 为此,我使用BaseStream.BeginWrite()。在异步回调中 我调用BaseStream.EndWrite()。这一切都很好。然而,有时 我想在BeginWrite()完成调用之前关闭一个端口 只要BeginWrite()挂起,Close()就会使其挂起。 我尝试过调用EndWrite(),但如果调用BeginWrite()也会挂起 正在等待。如何终止BeginWrite()线程?似乎有 没有BaseStream.Abort()或类似内容


谢谢

如果
Stream.Close()
不起作用,我还认为您不能取消该操作
EndWrite()
根据设计进行阻塞,同一线程上的
BeginWrite()
EndWrite()
序列与调用同步函数相同

实际上,有可能您的操作甚至没有线程在运行。该操作可能在内部使用IO完成端口,并且仅在线程池线程上触发回调。(我已经有一段时间没有调查那件事了)


但是您可以做的是“放弃”流,在代码中设置一个标志,当回调到达时,如果设置了标志,只需关闭流即可。记得在旗子周围加上一个锁,或者让旗子不稳定,我找到了一个方法,但是有点不成熟。此方法关闭端口并中止,但在进程中引发几个异常。基本上,我使用反射获取设备的文件句柄,如下所示:

object p = _port.BaseStream.GetType().GetField("_handle", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField).GetValue(_port.BaseStream);
IntPtr hFile = (IntPtr)p.GetType().GetField("handle", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField).GetValue(p);
其中_port是打开的串行端口。然后,我关闭文件,如下所示

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool CloseHandle(IntPtr hFile);
CloseHandle(hFile);
可能有更好的方法调用BaseStream中的一个私有方法,但这是一种方法:)



我放弃了那条小溪,那很好。但是,尝试重新打开会导致失败。我怀疑这可能做不到。有趣的是,我有一个商业win32控制台应用程序,它也做同样的事情,而且运行良好。谢谢。你试过一次写更少的数据吗?然后你可以更快地关闭。