исключение объекта - PullRequest
       14

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

1 голос
/ 16 мая 2009

Хорошо, ребята, в моем коде возникла такая проблема, которая раньше не появлялась ..

  public void StartUdpListener(Object state)
    {


       /* sock1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        sock1.Bind(receiveEndPoint);

        EndPoint ep = (EndPoint)receiveEndPoint;*/



       recv = sock1.ReceiveFrom(receivedNotification, ref ep);

       notificationReceived = Encoding.ASCII.GetString(receivedNotification, 0, recv);

       //sock1.Close();

       if (listBox1.InvokeRequired)
       {
           this.Invoke((MethodInvoker)delegate { listBox = new StringBuilder(this.listBox1.Text); });
       }
       listBox.AppendLine(notificationReceived);


       if (listBox1.InvokeRequired)
       {
           pos = listBox1.FindString(notificationReceived);
           if (pos >= 0)
           {
           }
           else
           {
               this.Invoke((MethodInvoker)delegate { this.listBox1.Items.Add(listBox.ToString()); });
           }
       }

    }

Я получаю исключение ObjectDisposedException о том, что строка:

   this.Invoke((MethodInvoker)delegate { listBox = new StringBuilder(this.listBox1.Text); });

не может быть выполнено, так как listBox1 расположен. Как это возможно, и нужно ли что-нибудь сделать?

Ответы [ 2 ]

1 голос
/ 29 октября 2009

Я делаю следующие предположения:

  1. Этот код является методом в форме (System.Windows.Forms.Form).
  2. Переменная 'listBox1' является элементом управления ListBox на форме.
  3. Вы получаете исключение ObjectDisposedException при закрытии формы.
  4. Вы запускаете этот метод в отдельном потоке (не показан в коде, но подразумевается в вопросе).

Я бы предположил, что ваш код блокируется при вызове receiveFrom () в сокете, когда форма закрыта. Следующее сообщение, которое поступает из сети, заставляет returnFrom возвращаться, после чего вы помещаете полученное сообщение в список, который больше не существует. При первом обращении к этому списку появляется строка кода «this.listBox1.Text» при создании StringBuilder, которая является строкой, вызывающей исключение ObjectDisposeException. ListBox - это объект, который может быть удален, хотя в данный момент это может быть и форма, в зависимости от скорости поступления сообщений.

Кажется, что многое нужно сделать, но я не уверен, что такое правильный совет. Я сначала проверил бы мои предположения 1-4 выше, а затем изучил бы рефакторинг вашего приложения так, чтобы оно НЕ использовало несколько потоков. Я делаю это предложение, потому что должен предположить, что это не единственная проблема с потоками, которая может возникнуть в вашем приложении. Я, безусловно, могу ошибаться в этом предположении, и в этом случае вы можете проигнорировать ответ.

Если я ограничу часть «что нужно сделать» вашего вопроса более ограниченной областью, то я бы посоветовал правильно отключить ваш приемник UDP, прежде чем разрешить закрытие окна, снова при условии, что мои предположения верны.

0 голосов
/ 21 мая 2009

Комментарий к этому блоку:

if (listBox1.InvokeRequired)
{
    this.Invoke((MethodInvoker)delegate { listBox = new
        StringBuilder(this.listBox1.Text); });
}
listBox.AppendLine(notificationReceived);

StringBuilder (список) может быть нулевым в точке, которую вы делаете .AppendLine. Это потому, что вы создаете список в другом потоке, где вы его используете. Также новый объект StringBuilder создается только в том случае, если этот код выполняется в потоке без пользовательского интерфейса (вот что проверяет listBox1.InvokeRequired).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...