我正在做的是编写一个WPF应用程序来使用我们的设备。应用程序将一些命令写入设备并从中读取命令的响应。我从pinvoke.net网站获得了针对CreateFile,WriteFile,ReadFile等的pinvoke声明。
我做了一个函数做了以下事情,CreateFile(带有标志FILE_FLAG_OVERLAPPED )打开设备,WriteFile发送命令,ReadFile读取响应,WaitForSingleObject和GetOverlappedResult捕获超时异常(如果设备没有响应),CloseHandle关闭设备。
如果我在UI线程中调用它,这个函数总是工作正常。但我想在后台线程中调用它以保持UI活动。所以我在Window_Loaded方法中创建了一个线程(Work是我的函数的名字)。
t = new Thread(Work);
t.Start();
然后ReadFile,WaitForSingleObject和GetOverlappedResult组可能会遇到错误,这三个函数返回成功,GetOverlappedResult可以捕获从设备返回的正确读取长度。但是没有从填充在字节数组缓冲区中的设备读取的实际数据传递给ReadFile函数。失败率约为50%。
如果我等待线程t完成,那么它总是再次正常工作。
t = new Thread(Work);
t.Start();
t.join();
原因在这种情况下UI也会挂起。
我搜索了这个问题,但没有找到完全相同的问题。我试图明确地将后台线程的公寓状态设置为STA或MTA,但它不起作用。
t = new Thread(Work);
t.SetApartmentState(ApartmentState.STA);
t.Start();
这让我很困惑。如果您有任何想法,请帮助我。谢谢你的阅读。
答案 0 :(得分:0)
我找不到根本原因。但我通过在C ++函数中重写读取过程并使用pInvoke调用我的C ++函数来绕过它。