|
С# Средство разработки на платформе .Net |
07.02.2017, 07:24
|
#1
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
async / await / dispatcher
Помогите уяснить.
Есть такой код:
private bool DoSomething() { if (abc) return false; Dispatcher.BeginInvoke(async () => { await MyMethodAsync(); }); return true; }
Вопрос 1- выполнится ли return true; сразу же, или будет ждать MyMethodAsync ?
Это не мой код, разбираюсь в чужом.
По моим соображениям, всё что внутри Dispatcher.BeginInvoke() выполнится "когда-то, не сразу, т.к. суть этого метода - асинхронное выполнение в ui потоке именно этого диспетчера".
И значит, return true; выполнится сразу же.
Из доки:
Dispatcher.BeginInvoke Method Executes a delegate asynchronously on the thread the Dispatcher is associated with.
Соответственно, вопрос 2 - есть ли смысл писать await внутри BeginInvoke, если далее нет кода, завязанного на окончание (результат) MyMethodAsync() ?
Вроде очевидно, но вдруг я чё-то не догоняю.
|
(Offline)
|
|
07.02.2017, 14:00
|
#2
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: async / await / dispatcher
Соответственно, вопрос 2 - есть ли смысл писать await внутри BeginInvoke, если далее нет кода, завязанного на окончание (результат) MyMethodAsync()
|
Тебе студия должна выкинуть ошибку компиляции "Нельзя дождаться void метода", если не асинк метод.
Dispatcher.BeginInvoke(async () => { await MyMethodAsync(); });
|
И вообще смысла нету async/await в диспатчере. Это запуск нового потока из потока диспатчера, при этом диспатчер запущен из другого потока, что бы вызвать метод в UI-потоке. Бред.
Собственно пост:
https://professorweb.ru/my/WPF/docum...vel31/31_2.php
Вопрос 1- выполнится ли return true; сразу же, или будет ждать MyMethodAsync ?
|
Сразу в return true.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.02.2017, 07:59
|
#3
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: async / await / dispatcher
Спасибо.
Сообщение от RegIon
Тебе студия должна выкинуть ошибку компиляции "Нельзя дождаться void метода", если не асинк метод.
|
не, там же внутри BeginInvoke есть префикс async.
|
(Offline)
|
|
08.02.2017, 08:59
|
#4
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: async / await / dispatcher
Сообщение от Жека
Спасибо.
не, там же внутри BeginInvoke есть префикс async.
|
А, ну да. Тогда он просто подчеркнет и скажет, что ассинхронная операция выполнится синхронно, так как метод синхронный.
|
(Offline)
|
|
08.02.2017, 19:37
|
#5
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: async / await / dispatcher
Сообщение от RegIon
Это запуск нового потока из потока диспатчера, при этом диспатчер запущен из другого потока, что бы вызвать метод в UI-потоке. Бред.
|
Какого еще нового потока? async/await сами по себе не создают новых потоков, соответственно тут уже надо смотреть реализацию MyMethodAsync.
|
(Offline)
|
|
08.02.2017, 21:54
|
#6
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: async / await / dispatcher
Сообщение от cherepets
Какого еще нового потока? async/await сами по себе не создают новых потоков, соответственно тут уже надо смотреть реализацию MyMethodAsync.
|
Мы как-то уже обсуждали это и даже тесты проводили.
Тут: http://forum.boolean.name/showthread.php?t=20463&page=2
|
(Offline)
|
|
08.02.2017, 22:24
|
#7
|
Бывалый
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений (для 450 пользователей)
|
Ответ: async / await / dispatcher
Сообщение от RegIon
|
И что же там обсуждали? await просто ожидает что-то, может завершения работы потока, может чтения из сокета, может какого-то сигнала (из ядра, например).
вопрос 2 - нет конечно, не нужно ожидать завершения чего-либо, если от этого ничего не зависит.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.03.2017, 18:52
|
#8
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Ответ: async / await / dispatcher
Сообщение от Жека
Есть такой код:
private bool DoSomething() { if (abc) return false; Dispatcher.BeginInvoke(async () => { await MyMethodAsync(); }); return true; }
Вопрос 1- выполнится ли return true; сразу же, или будет ждать MyMethodAsync ?
|
Выполнится сразу. Метод просто кладет лямбду в очередь диспетчеру.
Сообщение от Жека
Соответственно, вопрос 2 - есть ли смысл писать await внутри BeginInvoke, если далее нет кода, завязанного на окончание (результат) MyMethodAsync() ?
|
Смысл отсутствует.
Сообщение от RegIon
И вообще смысла нету async/await в диспатчере. Это запуск нового потока из потока диспатчера, при этом диспатчер запущен из другого потока, что бы вызвать метод в UI-потоке. Бред.
|
Так же присоединюсь к тем, кто сказал про трединг. await имеет fast'path-ы в некоторых кейсах и может выполняться синхронно, и да, ситуация с тредингом очень зависит от реализации метода, который ожидают.
Попробуйте доказать спавн нового треда при ожидании такого метода:
private Task<bool> SpawnNewThreadAsync() { return Task.FromResult(true); }
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:50.
|