B_M*_*ore 4 c# usb file-io pinvoke hid
在与我的HID设备进行数据传输会话结束时,我的软件有大约20%的机会停止写入函数WriteFile.
这是用C#编写的,我无法弄清楚为什么会这样.每个数据包20%的错误率是不可接受的,我很难找到它的底部,我想知道它是否与我的声明或数据类型有关?
这是导入
[DllImport("kernel32.dll")]
static public extern int WriteFile(int hFile, ref byte lpBuffer, int nNumberOfBytesToWrite, ref int lpNumberOfBytesWritten, int lpOverlapped);
Run Code Online (Sandbox Code Playgroud)
这就是对暂停功能的调用
Result = USBSharp.WriteFile(hidHandle, ref outputReportBuffer[0], outputReportBuffer.Length, ref NumberOfBytesWritten, 0);
Run Code Online (Sandbox Code Playgroud)
确认手柄是有效的,其余的是相当自我解释的......
该功能根本不会返回.我在网上看了几个不同的地方这个问题,大多数人都没有修复我.如果它失败了,我只会对它进行线程化并重新调用它,但是在数百个数据包上执行20%的时间只是......非常糟糕.
我正在使用Windows 7,C#,.NET 4.0,并且HID设备没有停止它仍然处于活动状态并且正在运行 - 不仅如此,而且整个数据传输正常发生并且此调用在最后发生以完成事务并且然后停止(即使我已经拥有所有数据).不幸的是,我不能忽略交易的最后部分,因为这些数据需要100%维护,否则糟糕,糟糕,用户会遇到不好的事情.
如果问题仍然存在,那么您可以考虑实施超时机制:
var stream= new FileStream(hidHandle,FileAccess.Write,false);
var waitEvent= new ManualResetEventSlim();
void Write(byte[] report, int timeout){
waitEvent.Reset();
stream.BeginWrite(report,0,report.Lenght,(ar)=>{stream.EndWrite(ar);waitEvent.Set();},null);
waitEvent.Wait(timeout);
}
Run Code Online (Sandbox Code Playgroud)