2013-02-28 3 views
0

Привет, коллеги-программисты!objectdisposedexception C#

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

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

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

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

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

Здесь `s код:

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); 
      } 
     } 
} 
+0

Есть ли причина для вызова как Close, так и Dispose? Метод Close уже вызывает Dispose. –

+0

Это программное обеспечение Intermec? Просмотрите лучшие хиты google для «BarcodeReadEventHandler», у вас много проблем. И, конечно, сначала обратитесь к поставщику за помощью, они узнают об этой проблеме. –

+0

Майк, на самом деле у меня нет причин. Просто положите его на тест (отчаяние? LoL) – Andrew

ответ

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); 
+0

Tks для вашего ответа, но он все еще не работал ... Любые предложения? – Andrew

+0

Hm. Хорошо, время для некоторой диагностики. Когда вы * делаете * видите исключение, каковы первые несколько кадров стека? Кажется ли, что оно происходит в tbCodMaterial_TextChanged или в другом месте? –

+0

первый в кадре указывает на текстовое поле, поэтому да, похоже, оно происходит в tbCodMaterial_TextChanged – Andrew