объектное исключение С#

Здравствуйте товарищи программисты!

Я разрабатываю Windows Forms .NET Compact Framework 2.0 для устройства Windows Mobile 6.1 с аппаратным считывателем штрих-кода.

Я могу использовать считыватель штрих-кодов для чтения штрих-кодов, а также активировать и деактивировать его. За исключением того, что когда я пытаюсь что-то прочитать и перейти к следующей форме, я получаю объектное исключение. Это происходит (я думаю), потому что мне нужно избавиться от экземпляра считывателя штрих-кода, а затем создать новый в следующей форме.

Проблема в том, что когда я использую кнопку для перехода к следующей форме, используя тот же код для удаления считывателя штрих-кода, у меня нет исключения objectdisposedexception. Когда я просто помещаю загрузку формы в событие textchanged, ошибка возникает, но не перехватывается никакими операторами try/catch, что приводит к сбою приложения.

Я также не могу отладить его, потому что эмулятор VS для Windows Mobile не работает с DLL устройства для чтения штрих-кодов.

Кто-нибудь может мне помочь?

Вот код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;
using System.Windows.Forms;

//DLL that controls the barcodereader
using Intermec.DataCollection;

namespace WOPT_Coletor.view.ConsultarPosicao
{
    public partial class frmConsultarPosicao_2 : Form
    {

        public BarcodeReader leitor;

        public frmConsultarPosicao_2()
        {
            InitializeComponent();
            ShowHide.ShowTopStatusbar(false);

            //code to work with the barcode reader
            model.LeitorCodigoDeBarras classeLeitor = new model.LeitorCodigoDeBarras();
            leitor = classeLeitor.LerCodigoDeBarras();
            leitor.BarcodeRead += new BarcodeReadEventHandler(this.eventoLeitorCodigoDeBarrasArmazenagem1);
        }    

        //Event to receive the barcode reading information
        void eventoLeitorCodigoDeBarrasArmazenagem1(object sender, BarcodeReadEventArgs e)
        {
            tbCodMaterial.Text = e.strDataBuffer.Trim();
        }

        private void tbCodMaterial_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (tbCodMaterial.Text.Length == 23)
                {                        
                    Cursor.Current = Cursors.WaitCursor;
                    Cursor.Show();

                    //disposal of the barcodereader instance
                    leitor.ScannerOn = false;
                    leitor.ScannerEnable = false;
                    leitor.Dispose();
                    leitor = ((BarcodeReader)null);

                    //processing of the information read.
                    char[] auxcodMaterial = new char[9];

                    using (StringReader str = new StringReader(tbCodMaterial.Text))
                    {
                        str.Read(auxcodMaterial, 0, 8);
                    }    
                    string codMaterial = new string(auxcodMaterial);

                    //loads next form
                    Form destino = new frmConsultarPosicao_3(codMaterial);
                    destino.Show();

                    Cursor.Current = Cursors.Default;
                    Cursor.Show();

                    //closes and dispose of the current form
                    this.Close();
                    this.Dispose(true);
                }    
            }

            catch (ObjectDisposedException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
}

person Andrew    schedule 28.02.2013    source источник
comment
Есть ли причина для вызова как Close, так и Dispose? Метод Close уже вызывает Dispose.   -  person Mike Guthrie    schedule 28.02.2013
comment
Это программное обеспечение Intermec? Просмотрите лучшие результаты Google для BarcodeReadEventHandler, у многих людей была ваша проблема. И, конечно же, сначала обратитесь за помощью к поставщику, они узнают об этой проблеме.   -  person Hans Passant    schedule 28.02.2013
comment
Майк, на самом деле у меня нет причины. Просто проверьте это (отчаяние? LoL)   -  person Andrew    schedule 28.02.2013
comment
Да, это программное обеспечение Intermec. Яve read all posts Iнашел в Интернете, но безуспешно! Но спасибо!   -  person Andrew    schedule 28.02.2013


Ответы (1)


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

private readonly Object mySynchronizationObject = new Object;
...
lock (mySynchronizationObject)
{
    if (leitor != null)
    {
         //disposal of the barcodereader instance
         ...
    }
}

Также не мешало бы отключиться от события перед выключением (внутри блокировки выше):

leitor.BarcodeRead -= new BarcodeReadEventHandler(this.eventoLeitorCodigoDeBarrasArmazenagem1);
person Andy Hopper    schedule 28.02.2013
comment
Спасибо за ваш ответ, но он все еще не работает ... Есть предложения? - person Andrew; 01.03.2013
comment
Хм. Ладно, пора на диагностику. Когда вы увидите исключение, каковы первые несколько кадров стека? Возникает ли оно в tbCodMaterial_TextChanged или где-то еще? - person Andy Hopper; 01.03.2013
comment
первые кадры указывают на текстовое поле, так что да, похоже, что они происходят из tbCodMaterial_TextChanged - person Andrew; 04.03.2013