Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Eccezione ObjectDisposedException immotivata...
Forum - C# / VB.NET - Eccezione ObjectDisposedException immotivata...

Avatar
BionicGod (Normal User)
Rookie


Messaggi: 33
Iscritto: 16/06/2011

Segnala al moderatore
Postato alle 0:18
Giovedì, 04/08/2011
Salve a tutti. Nel seguente listato, dopo che il metodo Cancel() viene richiamato si genera un'eccezione (ObjectDisposedException) nel metodo asincrono AcceptCall. Precisamente la riga dove si verifica l'errore è la seguente:
Codice sorgente - presumibilmente Plain Text

  1. Sock = Listener.EndAcceptSocket(iar);


L'errore è riferito alla variabile Listener e dice che l'oggetto è stato eliminato.

Ecco il codice della classe completa:
Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4.  
  5. namespace Help_Center
  6. {
  7.     public class Connection
  8.     {
  9.         public static TcpListener Listener;
  10.         public Socket Sock;
  11.         public Byte[] Buffer = null;
  12.         public const Int32 Port = 60000;
  13.  
  14.         public Connection()
  15.         {
  16.             Listener = new TcpListener(IPAddress.Any, Port);
  17.             Listener.Start();
  18.             Listener.BeginAcceptSocket(new AsyncCallback(AcceptCall), Listener);
  19.         }
  20.  
  21.         [b]public void Cancel()
  22.         {
  23.             Listener.Stop();
  24.             UserEvent -= u_UserEvent;
  25.         }[/b]
  26.  
  27.         void Receive(IAsyncResult iar)
  28.         {
  29.             ((Socket)iar.AsyncState).EndReceive(iar);
  30.             String[] Login = Functions.BytesToStrArr(Buffer);
  31.             if (Login[0].Trim() == "LOGIN")
  32.                 MessageBox.Show(Login[1]);
  33.             else
  34.                 Sock.Close();
  35.         }
  36.  
  37.         void AcceptCall(IAsyncResult iar)
  38.         {
  39.             Sock = Listener.EndAcceptSocket(iar);
  40.                 Buffer = new Byte[Sock.Available];
  41.                 Sock.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(Receive), Sock);
  42.                 Listener.BeginAcceptSocket(new AsyncCallback(AcceptCall), Listener);
  43.         }
  44.     }
  45. }




L'errore si verifica perché quando chiudo il TcpListener, esso viene eliminato, ma come faccio ad interrompere il metodo AcceptCall?
Pensavo si interrompesse con la chiusura del TcpListener visto che sono correlati.

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 11:05
Giovedì, 04/08/2011
Devi assicurarti di chiamare EndAcceptSocket nel metodo Cancel. Puoi controllare lo stato dell'operazione mediante l'interfaccia IAsyncResult.

P.S.: un campo statico inizializzato in un costruttore d'istanza mi fa pensare che ci sia qualcosa che non va...


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM