Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Асинхронные делегаты


Автор: ChiciucMaxim 28.8.2008, 17:05
Добрый день. Вопрос мой об ассинронных делегатах. Я не могу никак понять EndInvoke() дожидается окончания выполнения потока в котором выполняется задаваемая функция или  EndInvoke() дожидается возврата задаваемой функции. 
Вот пример:
using System;
using System.Collections.Generic;
using System.Text;

namespace Multithreading
{
   class Program
   {
      public delegate void MyDelegate();

      static void MyEndMethod(IAsyncResult l)
      {
         Console.WriteLine("In end method.");
      }

      static void DelegateFunction()
      {
          Console.WriteLine("In a delegate function");
      }

      static void Main(string[] args)
      {
         MyDelegate ob = new MyDelegate(DelegateFunction);

         AsyncCallback cb = new AsyncCallback(MyEndMethod);

         IAsyncResult s = ob.BeginInvoke(cb, null);
         ob.EndInvoke(s);
      }
   }
}

Результат выполнения тут: In a delegate function.
Я так понимаю что ob.EndInvoke(s) ждет лишь возврата функции MyEndMethod() выполняемой через делегат ob, так как не высвечивается "In end method.". Тот же результат получается и при замене "ob.EndInvoke(s)" на "s.AsyncWaitHandle.WaitOne(-1, true)". Не могу понять что же всетаки происходит. Помогите пожалуйста.  

Автор: mihryak 28.8.2008, 21:34
Цитата

AsyncCallback
References the callback method to be called when the asynchronous operation is completed. 

т.е. callback будет вызван уже после завершения ожидания EndInvoke

порядок вызовов такой:
1. DelegateFunction()
2. EndInvoke(s)
3. MyEndMethod

если последней строчкой в main напишешь
Код

Console.ReadKey();

то увидишь, что оба метода отработали

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)