Рассмотрим следующий код:
public class Bar {
Foo foo;
void Go() {
foo = new Foo();
foo.Send(...);
foo.Dispose();
foo = null;
}
}
public class Foo : IDisposable {
public void Send(byte[] bytes) {
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.SetBuffer(bytes, 0, bytes.Length);
args.UserToken = socket;
args.RemoteEndPoint = endPoint;
args.Completed += new EventHandler<SocketAsyncEventArgs>(OnSendCompleted);
socket.SendAsync(args);
}
private void OnSendCompleted(object sender, SocketAsyncEventArgs e) {
Debug.WriteLine("great");
}
public void Dispose() {
//
}
}
Таким образом, класс Bar запускает метод Init, который создает экземпляр класса Foo и запускает метод Send, а затем уничтожает экземпляр Foo. Метод Send тем временем создает экземпляр уровня метода SocketAsyncEventArgs, устанавливает событие Completed и затем запускает метод SendAsync.
Если предположить, что SendAsync завершает работу после того, как для экземпляра Foo установлено значение null, что происходит с обработчиком событий? Это все еще огонь? Если я не хочу, чтобы он запускался, как правильно очистить класс Foo, зная, что переменная уровня метода порождает событие.