Отмена асинхронных вызовов
От: jedi Мухосранск  
Дата: 19.09.08 08:27
Оценка:
Всем привет.

Изучаю .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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.