WP7 BarcodeManager - Неверный межпоточный доступ - PullRequest
2 голосов
/ 22 марта 2012

Я пытаюсь использовать 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);
            }
        }

Как я могу решить это?

Ответы [ 3 ]

6 голосов
/ 22 марта 2012

Используйте Dispatcher для выполнения кода в потоке пользовательского интерфейса вместо этого в фоновом потоке:

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

Некоторые операции должны выполняться в потоке пользовательского интерфейса и не могут выполняться в фоновом потоке.

0 голосов
/ 22 марта 2012

Изображения создаются в потоке пользовательского интерфейса и недоступны в других потоках, если вы их не заморозите: http://msdn.microsoft.com/en-us/library/system.windows.freezable.aspx

в photoChooserTask_Completed вызывает Freeze прямо перед запуском фонового потока.

this.Image.Freeze();
worker.RunWorkerAsync();
0 голосов
/ 22 марта 2012

Возможно, вам не нравится доступ к вашему объекту изображения в другом потоке. Попытка передать изображение работнику:

worker.RunWorkerAsync(this.Image);

и в вашем рабочем использовании:

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