我在摩托罗拉 EMDK 2.7 中使用 Symbol.Barcode2 对象。我正在使用异步缓冲扫描模式。下面是一些示例代码,它为每个扫描事件附加一个要调用的委托,然后以异步缓冲模式启动扫描器:
Barcode2 symbolBarcode2 = new Barcode2(Symbol.Barcode2.Devices.SupportedDevices[0]);
symbolBarcode2.OnScan +=new Barcode2.OnScanHandler(symbolBarcode2_OnScan);
symbolBarcode2.ScanBufferStart();
要停止扫描仪,我调用 ScanBufferStop 方法:
symbolBarcode2.ScanBufferStop();
我在两种情况下使用 ScanBufferStop:
首先,在处理数据时,我想停止扫描仪并提醒用户。例子:
private void symbolReader_OnScan(ScanDataCollection scancollection)
{
if (scancollection.GetFirst.Text == "0000000000")
{
// Turn off scanner and alert user
symbolBarcode2.ScanBufferStop();
}
else
{
// Process data and wait for next scan
}
}
其次,当应用程序关闭时。
我的问题是,当调用 ScanBufferStop 时,应用程序会冻结。调试和检查调用堆栈显示在 Symbol.Barcode2.Barcode2.ScanBufferStop() 中有一个对 WaitOne() 的调用:
mscorlib.dll!System.PInvoke.PAL.Threading_Event_Wait(System.IntPtr handle = 1245201)
mscorlib.dll!System.Threading.EventWaitHandle.WaitOne() + 0x7 bytes
Symbol.Barcode2.dll!Symbol.Barcode2.Barcode2.ScanBufferStop() + 0x43 bytes
我还可以看到 Symbol 对象正在创建其他线程。我认为发生了什么是 ScanBufferStop() 正在检查另一个线程是否正在访问 Barcode2 对象,如果是,则调用 WaitOne。但是当我从委托中的同一个线程调用它时,会导致死锁情况。
通过创建我自己的从委托调用 ScannBufferStop 的新线程,我能够在第一个场景中绕过它:
private void symbolReader_OnScan(ScanDataCollection scancollection)
{
if (scancollection.GetFirst.Text == "0000000000")
{
// Turn off scanner and alert user
//symbolBarcode2.ScanBufferStop();
System.Threading.Thread t = new System.Threading.Thread(StopDelegate);
t.Start();
}
else
{
// Process data and wait for next scan
}
}
internal void StopDelegate()
{
symbolBarcode2.ScanBufferStop();
}
但是当应用程序退出时,我仍然遇到死锁问题。我尝试使用从不同线程调用 ScanBufferStop 的相同技术,但它仍然以一个线程挂起并调用 WaitOne() 结束。
我也试过调用 System.Threading.Thread.Sleep(0); 但这并没有帮助。
是否有人对缓冲扫描模式有类似的经验,或者可能有解决方案的一般线程/锁定问题?
谢谢