【发布时间】:2013-10-11 18:29:59
【问题描述】:
我在 Motorola 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); 但这没有帮助。
是否有人对缓冲扫描模式有任何类似的经验,或者可能有解决方案的一般线程/锁定问题?
谢谢
【问题讨论】:
标签: multithreading compact-framework barcode motorola-emdk