Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/39: Рейтинг темы: голосов - 39, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.06.2008
Сообщений: 24
1

асинхронные делегаты

28.08.2008, 18:07. Просмотров 7048. Ответов 11
Метки нет (Все метки)


Добрый день. Вопрос мой об ассинронных делегатах. Я не могу никак понять EndInvoke() дожидается окончания выполнения потока в котором выполняется задаваемая функция или EndInvoke() дожидается возврата задаваемой функции.
Вот пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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)". Не могу понять что же всетаки происходит. Помогите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2008, 18:07
Ответы с готовыми решениями:

Асинхронные сокеты
Здравствуйте. Очень нужна ваша помощь. Вот callback функция которая передается в метод асинхронного...

Асинхронные операции на C#
Реализую обмен данными с устройством по USB-каналу (bulk передача) с использованием функций WinUSB...

Асинхронные операции
Есть у меня источник с элементами (ObservableCollection), и специальные коллекции "отображения",...

Асинхронные операции
Console.WriteLine("Some code"); using (var fs = new System.IO.FileStream("File.txt",...

11
Администратор
79856 / 48419 / 244
Регистрация: 10.04.2006
Сообщений: 13,125
28.08.2008, 18:21 2
EndInvoke() дожидается возврата задаваемой функции.
0
0 / 0 / 0
Регистрация: 22.06.2008
Сообщений: 24
28.08.2008, 18:26  [ТС] 3
А WaitOne() тоже самое?
0
212 / 10 / 4
Регистрация: 25.04.2007
Сообщений: 67
28.08.2008, 19:32 4
Цитата Сообщение от Maxim Chiciuc Посмотреть сообщение
Не могу понять что же всетаки происходит. Помогите пожалуйста.
Происходит всё как запланировано ) Просто callback не успевает пройти до выхода из программы. Если в конце добавить что-нибудь типа

Console.ReadKey();

то второй строчкой выведется 'In end method'

ps: ну то есть основного делегата программа ждет как положено, а вот обратный вызов - нет, уже не ждёт...
0
0 / 0 / 0
Регистрация: 22.06.2008
Сообщений: 24
28.08.2008, 19:35  [ТС] 5
Dr.Acula,
отсюда я делаю вывод что EndInvoke() и WaitOne() не дожидаются окончания выполнения потока, а лишь возврата метода выполняемым делегатом?
0
Администратор
79856 / 48419 / 244
Регистрация: 10.04.2006
Сообщений: 13,125
28.08.2008, 19:40 6
Цитата Сообщение от Maxim Chiciuc Посмотреть сообщение
А WaitOne() тоже самое?
А WaitOne() блокирует текущий поток. Читайте MSDN.
0
0 / 0 / 0
Регистрация: 22.06.2008
Сообщений: 24
28.08.2008, 19:49  [ТС] 7
mik-a-el, EndInvoke() также блокирует текущий поток до возврата из метода выполняемым делегатом. Но тот сигнал который WaitOne() получает является завершением выполнения потока или же возврат из метода выполняемым делегатом. Просто провожу аналогию с WinApi функциями, там ведь WaitHandle() дожидался завершения выполнения потока.
0
212 / 10 / 4
Регистрация: 25.04.2007
Сообщений: 67
28.08.2008, 19:50 8
Из MSDN:
If the thread that initiates the asynchronous call does not need be the thread that processes the results, you can execute a callback method when the call completes. The callback method is executed on a ThreadPool thread.
т.е. обратный вызов идет другим потоком (лесом т.е. )))
0
2 / 2 / 1
Регистрация: 21.08.2009
Сообщений: 134
07.09.2009, 21:06 9
можно принудительно прервать работу асинхронного делегата? как?
0
304 / 157 / 11
Регистрация: 07.06.2009
Сообщений: 538
07.09.2009, 21:11 10
прерывать чтото принудительно не рекомендуется.
прервать работу асинхронного делегата?
нельзя вроде, только со Thread напрямую можно
0
2 / 2 / 1
Регистрация: 21.08.2009
Сообщений: 134
07.09.2009, 21:13 11
а как тогда? через глобальную переменную?
0
304 / 157 / 11
Регистрация: 07.06.2009
Сообщений: 538
07.09.2009, 21:19 12
ну не глобальную, а внешнюю)
это если чтото в цикле происходит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2009, 21:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Клиент + Сервер, асинхронные сокеты
Привет! Пишу клиент серверное приложение на основе асинхронных сокетов. Цель передача картинки....

Асинхронные методы в стиле Erlang
Уже не в первый раз встречаюсь с задачей и не знаю, как её реализовать согласно задумке. Задача...

Асинхронные сокеты. Работа из нескольких окон
Есть клиент и есть сервер. Написаны по примерам которые можно найти здесь и здесь соответственно....

SDK Яндекс Диск и асинхронные методы
Здравствуйте. Есть метод получения списка файлов в папке в SDK такой как GetListAsync. метод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.