Всем привет.
Изучаю .NET, возникают вопросы

.
В частности, не совсем понятно как решается проблема отмены асинхронных вызовов.
К примеру, у меня есть слушающий сокет, которому я сказал BeginAccept.
В какой-то момент, я решаю остановить прослушивание и вызываю socket.Close().
Что произойдет, если как раз в этот момент исполняется код из accept callback-а?
Ведь он может обращаться к объектам которые уже disposed, верно?
Следущий код, демонстрирует проблему (на примере таймера):
using System;
using System.ComponentModel;
using System.Timers;
namespace test
{
class Test
{
private Timer timer;
private System.Threading.AutoResetEvent evt;
private void OnTimer(object sender, ElapsedEventArgs args)
{
evt.Set(); // <-- Упс! Object disposed.
}
public void RunTest()
{
using (evt = new System.Threading.AutoResetEvent(false))
{
using (timer = new Timer())
{
timer.Elapsed += this.OnTimer;
timer.Interval = 10;
timer.Enabled = true;
evt.WaitOne(9, false);
timer.Enabled = false;
}
}
}
public static void Run()
{
var test = new Test();
test.RunTest();
}
}
class Program
{
private static void Main(string[] args)
{
while (true)
{
Test.Run();
}
}
}
}
Собственно вопрос состоит в следующем: есть ли стандартное средство, позволяющее дождаться завершения исполняющихся асинхронных вызовов перед dispos-ом объекта? Либо нужно городить дополнительную синхронизацию самому (очень не хочется).
Спасибо!
... << RSDN@Home 1.2.0 alpha rev. 0>>