2012-03-21 56 views
2

我想使用Windows Phone 7 Silverlight ZXing條碼掃描庫,但我有一些問題。WP7 BarcodeManager - 無效的跨線程訪問

我使用的是後臺工作,檢查圖像,但是當我這樣做:

WP7BarcodeManager.ScanBarcode(this.Image, BarcodeResults_Finished); 

代碼拋出一個異常:無效的跨線程訪問。

這裏是我的代碼...

void photoChooserTask_Completed(object sender, PhotoResult e) 
    { 
     if (e.TaskResult == TaskResult.OK) 
     { 
      ShowImage(); 

      System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage(); 
      bmp.SetSource(e.ChosenPhoto); 

      imgCapture.Source = bmp; 
      this.Image = new BitmapImage(); 
      this.Image.SetSource(e.ChosenPhoto); 

      progressBar.Visibility = System.Windows.Visibility.Visible; 
      txtStatus.Visibility = System.Windows.Visibility.Collapsed; 

      worker.RunWorkerAsync(); 
     } 
     else 
      ShowMain(); 
    } 

void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      try 
      { 
       Thread.Sleep(2000); 

       WP7BarcodeManager.ScanMode = com.google.zxing.BarcodeFormat.UPC_EAN; 
       WP7BarcodeManager.ScanBarcode(this.Image, BarcodeResults_Finished); 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine("Error processing image.", ex); 
      } 
     } 

我該如何解決這個問題?

+0

你爲什麼不把WP7BarcodeManager.ScanBarcode調用到你的photoChooserTask_Completed方法中?它會解決問題。 – 2012-03-21 22:29:06

+0

因爲我想在API正在處理圖像時顯示進度條。 – rpf 2012-03-21 22:32:02

回答

6

使用Dispatcher來執行,而不是在後臺線程UI線程的代碼:

Deployment.Current.Dispatcher.BeginInvoke(()=> 
    { 
     WP7BarcodeManager.ScanBarcode(this.Image, BarcodeResults_Finished); 
    }); 

某些操作需要在UI線程上運行,並且無法在後臺線程上運行。

+0

非常感謝您的幫助。這解決了我的問題:D – rpf 2012-03-22 21:48:35

+0

歡迎:) – thumbmunkeys 2012-03-23 10:02:56

0

它可能不喜歡訪問另一個線程上的圖像對象。試圖將圖像傳遞給工人:

worker.RunWorkerAsync(this.Image); 

,並在您的工作人員使用:

WP7BarcodeManager.ScanBarcode((BitmapImage)e.Argument, BarcodeResults_Finished); 
+0

問題是訪問另一個線程上的圖像...但您的解決方案不起作用:/ – rpf 2012-03-21 23:11:49

+0

它仍然給出相同的錯誤? – Nomad101 2012-03-21 23:16:08

+0

是的......同樣的錯誤 – rpf 2012-03-21 23:18:20

0

圖像都在UI線程上創建和不在onther線程訪問,除非你凍結他們:http://msdn.microsoft.com/en-us/library/system.windows.freezable.aspx

在photoChooserTask_Completed通話凍結

右側開始後臺線程之前。

this.Image.Freeze(); 
worker.RunWorkerAsync(); 
+0

這似乎不適用於WP7/Silverlight。 – Nomad101 2012-03-22 10:22:27

+0

對不起,錯過了那部分 – 2012-03-22 13:42:42

相關問題