WP7 BarcodeManager-无效的跨线程访问

本文关键字:线程 访问 BarcodeManager- 无效 WP7 | 更新日期: 2023-09-27 18:28:39

我正在尝试使用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);
            }
        }

我该如何解决这个问题?

WP7 BarcodeManager-无效的跨线程访问

使用Dispatcher在UI线程上执行代码,而不是在后台线程上执行:

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

有些操作需要在UI线程上运行,而不能在后台线程上运行。

它可能不喜欢在另一个线程上访问您的Image对象。尝试将图像传递给工作人员:

worker.RunWorkerAsync(this.Image);

并且在您的工人使用中:

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

图像是在UI线程上创建的,除非您冻结它们,否则无法在其他线程上访问:http://msdn.microsoft.com/en-us/library/system.windows.freezable.aspx

在photoChooserTask_Completed中,在启动后台线程之前立即调用Freeze。

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