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取消標記,所以你也可以取消掃描任務。