C# 条码扫描器处理异常
我在Windows CE中遇到BarcodeScannerFacade问题。 我有一个应用程序,客户可以在其中创建一个包含数据和图片的“案例”。 我正在尝试更新它,让客户能够用条形码扫描仪扫描条形码 现在,第一个案例结束得很好,没有问题,但是当我开始第二个案例时,我就不能再拍照了,因为它抛出了一个异常,带有一个“未知错误”。(它发生在调用CameraCaptureDialog.ShowDialog()方法之后) 经过一些研究,我发现我必须处理条形码扫描仪,因为它会干扰CCD 这是我如何实例化条形码扫描仪的:C# 条码扫描器处理异常,c#,.net,windows-ce,barcode,image,C#,.net,Windows Ce,Barcode,Image,我在Windows CE中遇到BarcodeScannerFacade问题。 我有一个应用程序,客户可以在其中创建一个包含数据和图片的“案例”。 我正在尝试更新它,让客户能够用条形码扫描仪扫描条形码 现在,第一个案例结束得很好,没有问题,但是当我开始第二个案例时,我就不能再拍照了,因为它抛出了一个异常,带有一个“未知错误”。(它发生在调用CameraCaptureDialog.ShowDialog()方法之后) 经过一些研究,我发现我必须处理条形码扫描仪,因为它会干扰CCD 这是我如何实例化条形
barcodeScanner = BarcodeScannerFacade.GetBarcodeScanner();
barcodeScanner.BarcodeScan += new BarcodeScanner.BarcodeScanEventHandler(barcodeScanner_BarcodeScan);
鉴于上述研究,我在代码中添加了以下行:
if (barcodeScanner != null)
{
barcodeScanner.Dispose();
}
唯一的问题是,当调用它时,它会随着NullReferenceException一起消亡。
调试器有以下消息:
“没有为任何调用堆栈帧加载符号。无法显示源代码。”
“未处理NullReferenceException”
堆栈跟踪如下所示:
- MyLibrary.SymbolBarcodeScanner.symbolReader_ReadNotify()
at TASK.Invoke()
- System.Windows.Forms.Control._InvokeAll()
- System.Windows.Forms.Control.WnProc()
- System.Windows.Forms.Control._InternalWnProc()
- Microsoft.AGL.Forms.EVL.EnterMainLoop()
- System.Windows.Forms.Application.Run()
- MyProgram.Program.Main()
一旦我删除了barcodeScanner.Dispose()行,它就不会死掉,但我不能再拍照了
任何帮助都将不胜感激
提前感谢,,
Rockbag您应该在Dispose方法周围添加一个try-catch块。您无法更改引发异常的外部代码:
if (barcodeScanner != null)
{
try { //try to run the dispose method on the barcodescanner to free external resources
barcodeScanner.Dispose();
} catch(Exception ex) {
//Do some logging if needed
}
}
尝试实现Terminate()方法: 这可能会有进一步的帮助:
这也是我的第一个想法,我确实尝试将其封装在一个try-catch块中,但出现了相同的错误:(try-catch块仅用于通过抑制错误来保持应用程序运行。而不是修复条形码扫描程序代码中的错误,该错误是外部的,您无法控制。您只是尝试在条形码扫描程序崩溃之前尽可能多地处理该错误。任何人都仍然拥有指向条形码扫描程序的活动链接。)rticle?我几年前用过,但看起来MS删除了它,但它非常好。有人仍然有它的参考资料并愿意分享吗?
public override void Terminate()
{
// If you have a scanner
if(barcodeScanner != null)
{
barcodeScanner.ScanDeinit();
// Any other necessary code for cleaning up...
// Free it up
barcodeScanner.Dispose();
// Indicate that you no longer have a scanner
barcodeScanner = null;
}
}