É 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 outroIDisposable
s) 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.