www.boolean.name

www.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   async / await / dispatcher (http://forum.boolean.name/showthread.php?t=20557)

Жека 07.02.2017 04:24

async / await / dispatcher
 
Помогите уяснить.

Есть такой код:
PHP код:

private bool DoSomething()
{
    if (
abc) return false;

    
Dispatcher.BeginInvoke(async () => { await MyMethodAsync(); });
    return 
true;


Вопрос 1- выполнится ли return true; сразу же, или будет ждать MyMethodAsync ?

Это не мой код, разбираюсь в чужом.
По моим соображениям, всё что внутри Dispatcher.BeginInvoke() выполнится "когда-то, не сразу, т.к. суть этого метода - асинхронное выполнение в ui потоке именно этого диспетчера".
И значит, return true; выполнится сразу же.
Из доки:
PHP код:

Dispatcher.BeginInvoke Method
 
Executes a delegate asynchronously on the thread the Dispatcher is associated with


Соответственно, вопрос 2 - есть ли смысл писать await внутри BeginInvoke, если далее нет кода, завязанного на окончание (результат) MyMethodAsync() ?

Вроде очевидно, но вдруг я чё-то не догоняю.

RegIon 07.02.2017 11:00

Ответ: 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.

Жека 08.02.2017 04:59

Ответ: async / await / dispatcher
 
Спасибо.
Цитата:

Сообщение от RegIon (Сообщение 311750)
Тебе студия должна выкинуть ошибку компиляции "Нельзя дождаться void метода", если не асинк метод.

не, там же внутри BeginInvoke есть префикс async.

RegIon 08.02.2017 05:59

Ответ: async / await / dispatcher
 
Цитата:

Сообщение от Жека (Сообщение 311773)
Спасибо.

не, там же внутри BeginInvoke есть префикс async.

А, ну да. Тогда он просто подчеркнет и скажет, что ассинхронная операция выполнится синхронно, так как метод синхронный.

cherepets 08.02.2017 16:37

Ответ: async / await / dispatcher
 
Цитата:

Сообщение от RegIon (Сообщение 311750)
Это запуск нового потока из потока диспатчера, при этом диспатчер запущен из другого потока, что бы вызвать метод в UI-потоке. Бред.

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

RegIon 08.02.2017 18:54

Ответ: async / await / dispatcher
 
Цитата:

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

Мы как-то уже обсуждали это и даже тесты проводили.

Тут: http://forum.boolean.name/showthread.php?t=20463&page=2

h1dd3n 08.02.2017 19:24

Ответ: async / await / dispatcher
 
Цитата:

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

Тут: http://forum.boolean.name/showthread.php?t=20463&page=2

И что же там обсуждали? await просто ожидает что-то, может завершения работы потока, может чтения из сокета, может какого-то сигнала (из ядра, например).

вопрос 2 - нет конечно, не нужно ожидать завершения чего-либо, если от этого ничего не зависит.

johnk 13.03.2017 15:52

Ответ: async / await / dispatcher
 
Цитата:

Сообщение от Жека (Сообщение 311743)
Есть такой код:
PHP код:

private bool DoSomething()
{
    if (
abc) return false;

    
Dispatcher.BeginInvoke(async () => { await MyMethodAsync(); });
    return 
true;


Вопрос 1- выполнится ли return true; сразу же, или будет ждать MyMethodAsync ?

Выполнится сразу. Метод просто кладет лямбду в очередь диспетчеру.

Цитата:

Сообщение от Жека (Сообщение 311743)
Соответственно, вопрос 2 - есть ли смысл писать await внутри BeginInvoke, если далее нет кода, завязанного на окончание (результат) MyMethodAsync() ?

Смысл отсутствует. :)

Цитата:

Сообщение от RegIon (Сообщение 311750)
И вообще смысла нету async/await в диспатчере. Это запуск нового потока из потока диспатчера, при этом диспатчер запущен из другого потока, что бы вызвать метод в UI-потоке. Бред.

Так же присоединюсь к тем, кто сказал про трединг. await имеет fast'path-ы в некоторых кейсах и может выполняться синхронно, и да, ситуация с тредингом очень зависит от реализации метода, который ожидают.

Попробуйте доказать спавн нового треда при ожидании такого метода:

PHP код:

private Task<boolSpawnNewThreadAsync()
{
    return 
Task.FromResult(true);


:)


Часовой пояс GMT +1, время: 22:32.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Перевод: zCarot