Показать сообщение отдельно
Старый 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)