Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .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
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 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.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Жека (08.02.2017)
Старый 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
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: async / await / dispatcher

Сообщение от Жека Посмотреть сообщение
Спасибо.

не, там же внутри BeginInvoke есть префикс async.
А, ну да. Тогда он просто подчеркнет и скажет, что ассинхронная операция выполнится синхронно, так как метод синхронный.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 08.02.2017, 19:37   #5
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: async / await / dispatcher

Сообщение от RegIon Посмотреть сообщение
Это запуск нового потока из потока диспатчера, при этом диспатчер запущен из другого потока, что бы вызвать метод в UI-потоке. Бред.
Какого еще нового потока? async/await сами по себе не создают новых потоков, соответственно тут уже надо смотреть реализацию MyMethodAsync.
(Offline)
 
Ответить с цитированием
Старый 08.02.2017, 21:54   #6
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: async / await / dispatcher

Сообщение от cherepets Посмотреть сообщение
Какого еще нового потока? async/await сами по себе не создают новых потоков, соответственно тут уже надо смотреть реализацию MyMethodAsync.
Мы как-то уже обсуждали это и даже тесты проводили.

Тут: http://forum.boolean.name/showthread.php?t=20463&page=2
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 08.02.2017, 22:24   #7
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: async / await / dispatcher

Сообщение от RegIon Посмотреть сообщение
Мы как-то уже обсуждали это и даже тесты проводили.

Тут: http://forum.boolean.name/showthread.php?t=20463&page=2
И что же там обсуждали? await просто ожидает что-то, может завершения работы потока, может чтения из сокета, может какого-то сигнала (из ядра, например).

вопрос 2 - нет конечно, не нужно ожидать завершения чего-либо, если от этого ничего не зависит.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Жека (09.02.2017)
Старый 13.03.2017, 18:52   #8
johnk
Легенда
 
Регистрация: 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<boolSpawnNewThreadAsync()
{
    return 
Task.FromResult(true);

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Жека (27.03.2017)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 13:31.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com