É seguro ligar para o BeginXXX sem chamar EndXXX se a instância já estiver descartada

Ao usar oModelo de Programação Assíncrona geralmente é recomendável combinar todos osBeginXXX com umEndXXX, caso contrário, você corre o risco de vazar recursos até que a operação assíncrona seja concluída.

Esse ainda é o caso se a classe implementaIDisposable e a instância foi descartada chamandoDispose?

Se por exemplo eu usoUdpClient.BeginReceive em umUdpListener:

class UdpListener : IDisposable
{
    private bool _isDisposed;
    private readonly IPAddress _hostIpAddress;
    private readonly int _port;
    private UdpClient _udpClient;
    public UdpListener(IPAddress hostIpAddress, int port)
    {
        _hostIpAddress = hostIpAddress;
        _port = port;
    }
    public void Start()
    {
        _udpClient.Connect(_hostIpAddress, _port);
        _udpClient.BeginReceive(HandleMessage, null);
    }
    public void Dispose()
    {
        if (_isDisposed)
        {
            throw new ObjectDisposedException("UdpListener");
        }
        ((IDisposable) _udpClient).Dispose();
        _isDisposed = true;
    }
    private static void HandleMessage(IAsyncResult asyncResult)
    {
        // handle...
    }
}

Eu ainda preciso ter certezaUdpClient.EndReceive é chamado no descartado_udpClient (o que resultará apenas em umObjectDisposedException)?

Editar:

Não é incomum descartar umaUdpClient (e outroIDisposables) antes que todas as operações assíncronas sejam concluídas como forma de cancelar ou implementar um tempo limite, principalmenteoperações que nunca serão concluídas. Isso também é recomendadoao longo esta local.

questionAnswers(2)

yourAnswerToTheQuestion