0

在我的窗户silverlight的手机应用程序,我点击一个按钮来扫描条形码,然后sucesfuly扫描条码,但每当我按下按钮再次扫描,它给我是一个奇怪的例外。如何在Windows中的Silverlight应用程序,而不是使用线程睡眠任务延迟

System.Reflection.TargetInvocationException was unhandled 

消息:类型System.Reflection.TargetInvocationException'的未处理的异常发生在System.Windows.ni.dll 附加信息:异常已被调用的目标抛出。

我查了很多关于它,并有一个想法,可能是由于我的Thread.Sleep代码在该扫描功能。

我会把我的代码放在下面,请告诉我如何使用Task.delay而不是Thread.sleep并解决问题?我认为这是一个线程的问题,我不是非常好,多线程,所以请帮助

这里是我的代码

private async void ScanClick(object sender, EventArgs e) 
    { 

     var scanner = new MobileBarcodeScanner(); 
     var check = true; 
     var opts = new MobileBarcodeScanningOptions(); 
     opts.PossibleFormats = new List<BarcodeFormat> 
     { 
      BarcodeFormat.EAN_8, 
      BarcodeFormat.EAN_13 
     }; 
     Thread MT = new Thread(new ThreadStart(delegate 
     { 
      while (check) 
      { 
       scanner.AutoFocus(); 
       Thread.Sleep(autoFocusInterval);//value of autoFocus is 2000 
      } 
     })); 
     MT.Start(); 

     var result = await scanner.Scan(opts); 
     if(result!=null) 
     { 
      if(MT.IsAlive) 
      { 
       MT.Abort();//I try to abort to prevent the error, but it doesnt help. 
      } 
      MessageBox.Show("Scanned code : " + result.Text); 
      result = null; 
      MT = null; 
      scanner = null; 
      opts = null; 
      check = false; 
     } 


    } 

注意即使我只需点击第一次扫描按钮并打开扫描仪,然后按下而不扫描任何内容,然后再次返回时会产生异常。

所以第一次罚款不管怎么样,但是所以每隔一段时间进入扫描仪就会产生异常。

**原因需要延时:扫描我使用(ZXing.Net.Mobile)库中** 犯规自动对焦本身,所以直到条形码得到扫描的结果,我要开始自动手动对焦,每2秒钟一次。

预先感谢

+0

为什么想要在第一时间推迟? – Sparrow

+0

请参阅编辑后,我已经解释延迟在最后的原因。如果你能帮助我,我会非常感激,我现在​​想解决这个问题数周。谢谢 – touseef

+0

你试过'加入'那个线程? – VMAtm

回答

1

例外听起来像要么scanner.Autofocus或Thread.sleep代码扔你不处理线程内异常。

要做到这一点,并使用更优选Task.Delay可以按如下方式也采用了更为现代的工作方式,而不是用螺纹直接合作重写代码:

var cts = new CancellationTokenSource(); 
var ct = cts.Token; 
var mtTask = Task.Run(async() => 
{ 
    while (true) // Loop will be exited when cts.Cancel is called as Task.Delay will respond with an OperationCancelledException 
    { 
    scanner.AutoFocus(); 
    await Task.Delay(autoFocusInterval, ct); 
    } 
}, ct); 

var result = await scanner.Scan(opts); 
cts.Cancel(); 
try 
{ 
    await mtTask; 
} 
catch (OperationCancelledException) 
{} 
if (result != null) 
{ 
    MessageBox.Show("Scanned code : " + result.Text); 
} 

另外,你可以定义CTS事件处理程序之外的变量,让您取消任务时,你的窗体关闭,等等。如果scanner.Scan方法有一个重载接受的CancellationToken你应该使用这个过载,并为其提供了CT取消标记,所以你也可以取消扫描任务。