Безопасно ли вызывать 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
(и другиеIDisposable
s) до завершения всех асинхронных операций как способа отмены или реализации тайм-аута, особенно в течениеоперации, которые никогда не завершатся, Это также то, что рекомендуетсяна протяжении этот сайт.