Oppure

Loading
03/08/11 22:18
BionicGod
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:
Sock = Listener.EndAcceptSocket(iar);

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

Ecco il codice della classe completa:
using System;
using System.Net;
using System.Net.Sockets;

namespace Help_Center
{
    public class Connection
    {
        public static TcpListener Listener;
        public Socket Sock;
        public Byte[] Buffer = null;
        public const Int32 Port = 60000;

        public Connection()
        {
            Listener = new TcpListener(IPAddress.Any, Port);
            Listener.Start();
            Listener.BeginAcceptSocket(new AsyncCallback(AcceptCall), Listener);
        }

        [b]public void Cancel()
        {
            Listener.Stop();
            UserEvent -= u_UserEvent;
        }[/b]

        void Receive(IAsyncResult iar)
        {
            ((Socket)iar.AsyncState).EndReceive(iar);
            String[] Login = Functions.BytesToStrArr(Buffer);
            if (Login[0].Trim() == "LOGIN")
                MessageBox.Show(Login[1]);
            else
                Sock.Close();
        }

        void AcceptCall(IAsyncResult iar)
        {
            Sock = Listener.EndAcceptSocket(iar);
                Buffer = new Byte[Sock.Available];
                Sock.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(Receive), Sock);
                Listener.BeginAcceptSocket(new AsyncCallback(AcceptCall), Listener);
        }
    }
}



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.
aaa
04/08/11 9:05
Il Totem
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...
aaa