Экземпляр удаляется для общего ресурса при переходе назад из вида сканирования штрих-кода - PullRequest
0 голосов
/ 28 марта 2012

У меня есть функция сканирования штрих-кода в моем приложении. На главной странице есть кнопка со штрих-кодом, пользователь нажимает ее и переходит на страницу сканирования штрих-кода . Но когда он возвращается назад, я получаю сообщение о том, что:

This instance has been disposed. Possibly because another component required a shared resource.

Я удалил PhotoCamera и отменил все события в методе OnNavigatedFrom на странице сканирования штрих-кода, но все равно получил то же самое.

Я вошел в код и обнаружил, что что-то не так с этим методом:

PhotoCamera _cam;
VideoBrush _videoBrush = new VideoBrush();
Stopwatch watch = new Stopwatch();
int _nbTry;
Result result = null;
void cam_AutoFocusCompleted(object sender, CameraOperationCompletedEventArgs e)
        {
            if (result == null)
            { 
            try
            {
                _nbTry++;
                watch.Reset();
                watch.Start();

                while ((result == null) && (watch.ElapsedMilliseconds < 1500) && _cam != null)
                {
                    var binaryBitmap = GetBitmapFromVideo(_cam);
                    if (binaryBitmap != null)
                    {
                        try
                        {
                            result = BarCodeManager.ZXingReader.decode(binaryBitmap);
                        }
                        catch
                        {
                            // Wasn't able to find a barcode
                        }
                    }
                }

                if (result != null)
                {
                    BarCodeManager._onBarCodeFound(result.Text);
                }
                else
                {
                    if (_cam != null)
                    {
                        _cam.Focus();
                    }
                }
            }
            catch (Exception exc)
            {
                BarCodeManager._onError(exc);
            }
        }
      }

Возникло исключение, и следом является трассировка стека:

at Microsoft.Devices.Camera.InvokeAndRemapExceptions(Action a)
at Microsoft.Devices.PhotoCamera.get_IsFocusSupported()
at Microsoft.Devices.PhotoCamera.Focus()
at WP7.ScanBarCode.BarCode.cam_AutoFocusCompleted(Object sender, CameraOperationCompletedEventArgs e)
at Microsoft.Devices.Camera.<>c__DisplayClass21`1.<SafeFireEvent>b__1f(Object ignored)
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()

Есть идеи? Спасибо!

1 Ответ

2 голосов
/ 27 сентября 2012

Когда вы в первый раз покидаете страницу сканирования штрих-кода , вы, вероятно, утилизируете свой PhotoCamera.

, если просто утилизируете объект PhotoCamera, когда возвращаетесь страница сканирования штрих-кода вы получите эту ошибку:

This instance has been disposed. Possibly because another component required a shared resource.

Попробуйте избавиться от объекта PhotoCamera, а также от всех делегатов событий, таких как Initialized или , связанных :

// Release the camera object:
PhotoCamera.Dispose();

// Remove initialization event:
PhotoCamera.Initialized -= PhotoCamera_Initialized;

// For example, you must remove also the events linked to the camera management (e.g. when you press camera buttons):
CameraButtons.ShutterKeyHalfPressed -= CameraButtons_ShutterKeyHalfPressed;

Назовите этот код утилизации, когда попадете на событие OnNavigatedFrom вашей страницы сканирования штрих-кода , и все должно работать!

...