我正在尝试使用Windows Phone 7 Silverlight ZXing条码扫描库,但我遇到了一些问题。
我正在使用后台工作人员检查图像,但是当我这样做时:
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 :(得分:6)
使用Dispatcher
在后台线程上执行UI线程上的代码:
Deployment.Current.Dispatcher.BeginInvoke(()=>
{
WP7BarcodeManager.ScanBarcode(this.Image, BarcodeResults_Finished);
});
某些操作需要在UI线程上运行,并且无法在后台线程上运行。
答案 1 :(得分:0)
它可能不喜欢在另一个线程上访问您的Image对象。尝试将图像传递给工作人员:
worker.RunWorkerAsync(this.Image);
并在你的工人中使用:
WP7BarcodeManager.ScanBarcode((BitmapImage)e.Argument, BarcodeResults_Finished);
答案 2 :(得分:0)
图像是在UI线程上创建的,除非你冻结它们,否则无法在其他线程上访问:http://msdn.microsoft.com/en-us/library/system.windows.freezable.aspx
in photoChooserTask_Completed call在启动后台线程之前立即冻结。
this.Image.Freeze();
worker.RunWorkerAsync();