我正在开发一个与 USB 设备通信的 C# 项目。我打开连接:
[DllImport("Kernel32.dll", SetLastError = true)]
static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(string filename, [MarshalAs(UnmanagedType.U4)]FileAccess fileaccess, [MarshalAs(UnmanagedType.U4)]FileShare fileshare, int securityattributes, [MarshalAs(UnmanagedType.U4)]FileMode creationdisposition, int flags, IntPtr template);
private Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle;
...
safeFileHandle = CreateFile("\\\\.\\HsiUsb1", FileAccess.ReadWrite,FileShare.ReadWrite, 0, FileMode.Create, 0, IntPtr.Zero);
if (safeFileHandle.IsInvalid)
{
return Marshal.GetLastWin32Error();
}
var HsiPort = new FileStream(safeFileHandle, FileAccess.ReadWrite);
if (!HsiPort.CanRead)
{
return -1;
}
连接关闭:
if (HsiPort != null)
{
HsiPort.Close();
HsiPort = null;
}
if (safeFileHandle != null)
{
safeFileHandle.Close();
safeFileHandle = null;
}
只要我同步地从 FileStream 读取和写入数据,一切都很好,我可以多次关闭和打开 USB 连接。然而,由于 USB 设备在某些事件发生时发送数据,并且不知道发送了多少字节,因此程序将卡在 FileStream.Read() 上。
于是我开始用FileStream.BeginRead()和EndRead()异步读取数据。一切正常,但是,当我关闭连接并再次启动它时,句柄无效并且获得的错误代码为 5。
谁能帮我这个?如何正确关闭 SafeFileHandle?
提前致谢