Безопасно ли вызывать BeginXXX без вызова EndXXX, если экземпляр уже удален?

При использованииМодель асинхронного программирования обычно рекомендуется соответствовать каждомуBeginXXX сEndXXXв противном случае вы рискуете потерять ресурсы до завершения асинхронной операции.

Это все еще тот случай, если класс реализуетIDisposable и экземпляр был ликвидирован путем вызоваDispose?

Если, например, я используюUdpClient.BeginReceive вUdpListener:

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...
    }
}

Мне все еще нужно убедитьсяUdpClient.EndReceive называется на распоряжение_udpClient (который просто приведет кObjectDisposedException)?

Редактировать:

Это не редкость, чтобы избавиться отUdpClient (и другиеIDisposables) до завершения всех асинхронных операций как способа отмены или реализации тайм-аута, особенно в течениеоперации, которые никогда не завершатся, Это также то, что рекомендуетсяна протяжении этот сайт.

Ответы на вопрос(0)

Ваш ответ на вопрос