Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5 6 7 8 9 10 11      [все]
 Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
Думаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?

Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис.
31 июл 18, 22:50    [21619579]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34547
hVostt
Думаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?

Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис.


Тебе вообще зачем __асинхронный__ вызов нужен?
Наверное, чтобы он выполнялся параллельно с остальным кодом...
А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?
1 авг 18, 00:05    [21619662]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
MasterZiv
Тебе вообще зачем __асинхронный__ вызов нужен?
Наверное, чтобы он выполнялся параллельно с остальным кодом...
А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?


Похоже, вы очень сильно путаете понятия.
Вот вам ссылка почитать

Вкратце, асинхронный вызов мне нужен, чтобы I/O операции не блокировали рабочий поток из пула. Запуск подобного ожидания в параллельном потоке, это костыль, не решающий проблемы, но позволяющий, например, не блокировать единственный UI поток. В контексте серверных веб-приложений, подобный финт ушами вообще бесмысленнен. А в контексте, например, JavaScript и вовсе невозможен (не будем брать в расчёт не так давно появившиеся Web Workers).

В общем, вернёмся к вопросу. Уточню, откуда ноги растут у вопроса. Проблемы две:

1. избыточность повсеместного ключевого слова await, если есть какое-то подозрение, что код модуля будет исполнять асинхронные методы, он тоже должен быть асинхронным.

2. забыли await, получили проблемы, особенно, если мы не ожидаем результат, а только сам факт асинхронного исполнения (async void).
1 авг 18, 00:27    [21619690]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2421
hVostt,

ситуации разные бывают, с await больше возможностей для разработчика
        static void Main(string[] args)
        {
            MyMethod();
            Thread.Sleep(3000);
            Console.WriteLine("\r\n\r\nВыполняется какая-то работа...");
            sometask.Wait();
            Console.ReadKey();
        }

        static Task sometask;

        static async void MyMethod()
        {
            sometask = Task.Run(() =>
            {
                using (StreamWriter writer = File.CreateText("gloaming.txt"))
                {
                    writer.WriteLine("Длинное, синее, пахнет ямайским ромом. Что это?");
                }
                Thread.Sleep(5000); // что-то длительное...
                using (StreamReader reader = File.OpenText("gloaming.txt"))
                {
                    Console.WriteLine("\r\n\r\n" + reader.ReadLine());
                }
            });
            // тут нужно дождаться
            await (new WebClient().DownloadStringTaskAsync("https://www.sql.ru/forum/1300144/zachem-nuzhen-await"))
                .ContinueWith(t =>
                {
                    Console.WriteLine(t.Result.Substring(t.Result.IndexOf("ведь компилятор может определить"), 100));
                });
            // а тут не нужно, ну нет такой необходимости, как компилятор это определит?
            (new WebClient().DownloadStringTaskAsync("https://www.sql.ru/forum/1300144/zachem-nuzhen-await"))
                .ContinueWith(t =>
                {
                    using (StreamWriter writer = File.CreateText("noproblem.txt"))
                    {
                        writer.WriteLine(t.Result.Substring(t.Result.IndexOf("2. забыли await, получили проблемы"), 100));
                    }
                });
        }
1 авг 18, 01:51    [21619769]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
WebSharper
Member

Откуда:
Сообщений: 503
Тогда после введения этой особенности получилось бы нарушение обратной совместимости. До нее тот же самый код бы просто запускал метод. А после нее эвейтил бы таску.

Причем в документации бы пришлось писать что var x = y() ведёт себя по разному для методов возвращающих такску и прочие типы
1 авг 18, 06:17    [21619805]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
LR
            // тут нужно дождаться
            await (new WebClient().DownloadStringTaskAsync("https://www.sql.ru/forum/1300144/zachem-nuzhen-await"))
                .ContinueWith(t =>
                {
                    Console.WriteLine(t.Result.Substring(t.Result.IndexOf("ведь компилятор может определить"), 100));
                });


Это очень странный код, поясните, зачем вы используете здесь ContinueWith вместе с await?

            // тут нужно дождаться
            var result = await (new WebClient().DownloadStringTaskAsync("https://www.sql.ru/forum/1300144/zachem-nuzhen-await"));
            Console.WriteLine(t.Result.Substring(t.Result.IndexOf("ведь компилятор может определить"), 100));


По поводу второго "не нужно". Это распространённая ошибка. Если приложение нормально завершит свою работу раньше, чем ваш Task, то работа может быть прервана на середине и код в ContinueWith вообще не выполнится. И без await контекст синхронизации нужно передавать вручную (актуально для UI и для ASP.NET, но не Core).
1 авг 18, 08:35    [21619896]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 16252
WebSharper
Тогда после введения этой особенности получилось бы нарушение обратной совместимости. До нее тот же самый код бы просто запускал метод. А после нее эвейтил бы таску.


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

WebSharper
Причем в документации бы пришлось писать что var x = y() ведёт себя по разному для методов возвращающих такску и прочие типы


Если бы async был частью контракта, а не реализации, то компилятор бы скрывал таску, y() при этом возвращал результат функции, а не awaitable объект в контексте использования. Проблема в том, что возвращаемый результат типа Task ещё не говорит о том, что это асинхронный метод.
1 авг 18, 08:41    [21619914]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 1821
MasterZiv
hVostt
Думаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?

Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис.


Тебе вообще зачем __асинхронный__ вызов нужен?
Наверное, чтобы он выполнялся параллельно с остальным кодом...
А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?

+1
1 авг 18, 09:27    [21620006]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2421
hVostt
По поводу второго "не нужно". Это распространённая ошибка. Если приложение нормально завершит свою работу раньше, чем ваш Task, то работа может быть прервана на середине и код в ContinueWith вообще не выполнится. И без await контекст синхронизации нужно передавать вручную (актуально для UI и для ASP.NET, но не Core).

Это не ошибка, так задумано, если задание не выполнится до окончания работы приложения - это нормально, иначе задумано с sometask. Повторю, ситуации могут быть разными, await дает еще одну степень свободы - и это хорошо.
1 авг 18, 09:28    [21620014]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5425
hVostt
Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?

как вы правильно после заметили это не контракт, а реализация. контрактом является возврат интерфейса в котором есть управление задачей и получение результата. Т.е. компилятор не может вызвать метод асинхронно, await - синтаксический сахар, он просто вызывает методы ожидания возвращаемого интерфейса и попутно трасирует в него часть своей реализации.
Принципиальной проблемы в использовании await вне асинхронного метода нет, собственнно в плюсах так можно делать без проблем.

hVostt
Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис.

а как тогда должен себя вести код генерируемый компилятором?
  • всегда ждать завершения? тогда 21619662 вполне уместен
  • запоминать что переменная не переменная и её нужно проверять? тогда встаёт вопрос эффективности, фактически придётся делать ленивый вызов при использовании переменной, следить за ней, что в массовом порядке накладно.
  • 1 авг 18, 10:01    [21620111]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    WebSharper
    Member

    Откуда:
    Сообщений: 503
    hVostt
    Т.е. кроме обратной совместимости, других проблем вы не видите?
    Думаете, если бы язык проектировался заново, типа новая супер-мажорная версия, без обратной совместимости, от ключевого слова await могли бы отказаться?


    При этом можно было бы ввести другое умолчание (соответственно для поведения когда мы продолжаем исполнение, а не возвращаем управление вызвавшему методу).
    Т.е. у нас есть 3 действия - получить таску и что-то с ней сделать. Вернуть управление вызвавшему методу. Подождать пока вызванный метод закончится. Нам их надо как-то разграничить.
    1 авг 18, 12:49    [21620890]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Это не ошибка, так задумано, если задание не выполнится до окончания работы приложения - это нормально, иначе задумано с sometask. Повторю, ситуации могут быть разными, await дает еще одну степень свободы - и это хорошо.


    Спорить не буду. Лично я считаю, что запуск задач по принципу fire and forget должен осуществляться через планировщик заданий, и нормальное завершение программы не должно осуществляться путём terminate запущенных потоков. Либо нужно дожидаться выполнения всех заданий, либо посылать сигнал с требованием немедленного завершения работ, как минимум через CancellationToken, если мы говорим про C#.

    Так что это выглядит как ошибка и никак иначе.

    LR
    Повторю, ситуации могут быть разными, await дает еще одну степень свободы - и это хорошо.


    Проблема в том, что "ещё одна степень свободы" выливается в описанные выше мною проблемы.
    1 авг 18, 12:53    [21620899]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    как вы правильно после заметили это не контракт, а реализация. контрактом является возврат интерфейса в котором есть управление задачей и получение результата. Т.е. компилятор не может вызвать метод асинхронно, await - синтаксический сахар, он просто вызывает методы ожидания возвращаемого интерфейса и попутно трасирует в него часть своей реализации.


    Если мы говорим про C#, это довольно смелое утверждение насчёт "просто вызывает методы ожидания". Я спорил с Джоном Скитом на тему является ли await синтаксическим сахаром, и он меня убедил, что да, является. Но await принуждает компилятор строить конечный автомат без накладных расходов на количество кода в продолжении. А также разбирается с исключениями и контекстом синхронизации.

    В JavaScript да, это сахар, превращающийся в промисы.

    Конечно, из-за отсутствия контракта, компилятор не может сам сделать await, значит при его наличии, это можно было сделать, так?

    kealon(Ruslan)
    а как тогда должен себя вести код генерируемый компилятором?


    Он должен увидеть вызов асинхронного метода и выполнить его асинхронно, и не позволять дёргать асинхронные методы за пределами асинхронного контекста (асинхронного метода).

    kealon(Ruslan)
    всегда ждать завершения? тогда 21619662 вполне уместен


    Я не понимаю, почему до сих пор много людей путают конкурентность и асинхронность. Нет, не уместен.

    Давайте напомню, в JavaScript нельзя выполнить код параллельно. Можно выполнить
    1 авг 18, 13:00    [21620921]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    WebSharper
    Member

    Откуда:
    Сообщений: 503
    https://softwareengineering.stackexchange.com/questions/328087/why-are-promises-not-awaited-by-default
    1 авг 18, 13:06    [21620952]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    .. можно выполнить код асинхронно.

    kealon(Ruslan)
    запоминать что переменная не переменная и её нужно проверять? тогда встаёт вопрос эффективности, фактически придётся делать ленивый вызов при использовании переменной, следить за ней, что в массовом порядке накладно.


    При наличии контракта, видим, что метод асинхронный, значит выполняем его асинхронно. Т.е. компилятор сам вставляет await там, где он итак должен был быть написан программистом.
    1 авг 18, 13:09    [21620972]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    WebSharper
    https://softwareengineering.stackexchange.com/questions/328087/why-are-promises-not-awaited-by-default


    SO
    Note that a function being async doesn't turn it into something completely different, it just enables some syntax. A normal function returning a promise is just as asynchronous as a function marked with async.

    The await serves as a warning sign "the world may have changed in the mean time".

  • 1. await may be easier than multi threading, but it's still very error prone. During code review you have to look at each await, thinking "does the function rely on any information obtained before the await still being the same? Is this guaranteed?". Without an explicit await, you have to do so at every function invocation.
  • 2. Backwards compatibility. With your proposal code behaves completely different if the browse/runtime supports awaiting or not.
  • 3. If your code doesn't want to deal with awaiting, it needs to insert an async at every call to an externally defined function, just in case it returns a promise.
  • 4. Performance. The runtime needs to insert an if result is a promise then await check at every method call.


  • Ok.

    1. мы хотим видеть вызовы await в коде, но IDE мог бы подсвечивать, находить и показывать такие вызовы.
    2. обратная совместимость, аргумент. ок.
    3. если я не хочу эвейтить, то для этого нужен отдельный синтаксис, потому что в 90% (если не больше) случаев нужно эвейтить.
    4. только для нетипизированных языков, таких как JavaScript, это является проблемой. но и она решается точно также, как решаются все остальные проблемы отсутствия типизации.

    в общем, пока только обратная совместимость выглядит как преграда.
    ну ещё несколько лет нужно, чтобы люди привыкли к парадигме.
    1 авг 18, 13:25    [21621062]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    hVostt,

    давайте в реализации шарпа, и плавно к нативу в плюсах из которого видно куда что прыгает

  • любой асинхронный метод в шарпе возвращает контракт IASync<T> на получение значения
    далее с ним надо что-то делать

    собственно await это такой сахар который одновременно ждёт вычисления IASync<T> и мониторит не отменили ли головной метод и если отменили "трубит" полученному контракту "СТОП"

    тут надеюсь всё понятно

  • как это всё выглядит изнутри плюсов:
    вызвали аснхронный метод, собственно он возвращает контракт IASync<T>
    и тут можно с ним делать что угодно: подождать вызвать другой метод и пр.

  • как это может быть в плане реализации асинхронного метода:
    тут куча вариантов: асинхронная функция ОС, запуск обёрнутой задачи в пул и пр. пр.


    теперь:
    hVostt
    Но await принуждает компилятор строить конечный автомат без накладных расходов на количество кода в продолжении. А также разбирается с исключениями и контекстом синхронизации.
    ничего он не выдумывает, он просто вставляет код ожидания

    hVostt
    Конечно, из-за отсутствия контракта, компилятор не может сам сделать await, значит при его наличии, это можно было сделать, так?
    у него только контракт (IASync<T>) и есть, он и вызывает один из его методов, на саму реализацию он не влияет

    hVostt
    kealon(Ruslan)
    а как тогда должен себя вести код генерируемый компилятором?


    Он должен увидеть вызов асинхронного метода и выполнить его асинхронно, и не позволять дёргать асинхронные методы за пределами асинхронного контекста (асинхронного метода).

    kealon(Ruslan)
    всегда ждать завершения? тогда 21619662 вполне уместен


    Я не понимаю, почему до сих пор много людей путают конкурентность и асинхронность. Нет, не уместен.

    ему вообще по барабану, у компилятора только контракт на ожидание выполнения непонятно чего

    a =AsyncMet1(d);
    c = a + b;
    

    куда физически вставлять await?
  • 1 авг 18, 13:29    [21621078]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    hVostt
    .. можно выполнить код асинхронно.

    kealon(Ruslan)
    запоминать что переменная не переменная и её нужно проверять? тогда встаёт вопрос эффективности, фактически придётся делать ленивый вызов при использовании переменной, следить за ней, что в массовом порядке накладно.


    При наличии контракта, видим, что метод асинхронный, значит выполняем его асинхронно. Т.е. компилятор сам вставляет await там, где он итак должен был быть написан программистом.
    ещё раз повторю: "асинхронный метод в реализации шарпа значит, что возвращается контракт на получение значения"
    т.е. в нативе это какой-то стаб который, например, кидает задачу в пул на выполнение своего кода и возвращает интерфейс по ожиданию его завершения\отмены\получению результата и пр.
    1 авг 18, 13:42    [21621120]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    собственно await это такой сахар который одновременно ждёт вычисления IASync<T> и мониторит не отменили ли головной метод и если отменили "трубит" полученному контракту "СТОП"


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

    Сахар превращает метод в конечный автомат. Это можно посмотреть в дизассемблере IL, для асинхронного и синхронного вызовов. С ручным ожиданием через GetAwaiter и через await. Сгенерированный код будет абсолютно разный.

    kealon(Ruslan)
  • как это всё выглядит изнутри плюсов:
    вызвали аснхронный метод, собственно он возвращает контракт IASync<T>
    и тут можно с ним делать что угодно: подождать вызвать другой метод и пр.

  • как это может быть в плане реализации асинхронного метода:
    тут куча вариантов: асинхронная функция ОС, запуск обёрнутой задачи в пул и пр. пр.


  • Из плюсов, да и в C# тоже, весь код, который генерит await можно написать и самостоятельно. Чудеса начинаются, когда среди кучи последовательных и вложенных await доходим до функций, выполняющих непосредственно I/O операции, которые и "отпускают" поток восвоясь. А когда результат будет получен, будет выдернут любой свободный поток, который продолжит выполнение оставшегося кода. Вот здесь суть, которую многие упускают, когда пытаются "на пальцах" строить свои объяснения того, как это устроено. Это и правда выглядит так, как будто оставшийся кусок метода после await тупо завернули в коллбек. Но это наивно так полагать.

    kealon(Ruslan)
    hVostt
    Но await принуждает компилятор строить конечный автомат без накладных расходов на количество кода в продолжении. А также разбирается с исключениями и контекстом синхронизации.
    ничего он не выдумывает, он просто вставляет код ожидания


    Куда вставляет? Кто код ожидания будет выполнять? Что там со стеком? Могу ли я ожидать огромное количество асинхронных операций, с небольшим количеством рабочих потоков?

    kealon(Ruslan)
    у него только контракт (IASync<T>) и есть, он и вызывает один из его методов, на саму реализацию он не влияет


    Пока нет такого контракта, который напрямую говорит, что этот метод является асинхронным. Для await подойдёт любой объект, у которого есть метод GetWaiter(). Этого недостаточно, так как те же Task используются и для многопоточного программирования, как часть TPL.


    kealon(Ruslan)
    ему вообще по барабану, у компилятора только контракт на ожидание выполнения непонятно чего

    a = await AsyncMet1(d);
    c = a + b;
    


    куда физически вставлять await?


    Вот сюда. И только при условии, что метод, в котором находится этот код помечен как async.
    1 авг 18, 14:28    [21621271]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    т.е. в нативе это какой-то стаб который, например, кидает задачу в пул на выполнение своего кода и возвращает интерфейс по ожиданию его завершения\отмены\получению результата и пр.


    Т.е. будете ждать выполнение i/o операций на выделенном пуле потоков? Мдя...
    1 авг 18, 14:30    [21621278]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Valery_B
    Member

    Откуда: Москва
    Сообщений: 1989
    hVostt
    Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?

    Если я правильно понял, то ты хотел предложить не использовать await ?
    Но тогда как компилятор поймёт, до какого момента ему ждать ?

    private string GetExpensiveString()
    {
        Thread.Sleep(10000);
        return "Hello world";
    }
    
    private async void Button1Click(object sender, EventArgs e)
    {
        Task<string> task = new Task<string>(GetExpensiveString);
        task.Start();
        label1.Text = "Please wait";   
        string s = await task;
        label1.Text = s;
    }
    
    1 авг 18, 14:34    [21621296]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Valery_B
    Если я правильно понял, то ты хотел предложить не использовать await ?


    Не использовать ключевое слово await, в контексте, где его использование очевидно. Такой контекст есть.


    Valery_B
    private string GetExpensiveString()
    {
        Thread.Sleep(10000);
        return "Hello world";
    }
    
    // первый случай
    private async void Button1Click(object sender, EventArgs e)
    {
        // такое использование НЕ ОЧЕВИДНО
        // и это не асинхронный вызов!!
        Task<string> task = new Task<string>(GetExpensiveString);
        task.Start();
        label1.Text = "Please wait";   
        string s = await task;
        label1.Text = s;
    }
    
    // второй случай
    private async void Button1Click(object sender, EventArgs e)
    {
        // а такое очевидно
        // и это асинхронный вызов!
        label1.Text = "Please wait";   
        label1.Text = GetExpensiveStringAsync();
    }
    


    Первый случай это запуск таски в отдельном потоке, последующий await приводит только к асинхронному ожиданию (о чём было сказано 21619662), а не асинхронному выполнению.

    Во втором случае, функция помечена async, значит вызов любой асинхронной функции должен быть асинхронным, если это не указано каким-то определённым образом иначе.
    1 авг 18, 14:50    [21621364]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    private async AwaitableResult<string> GetExpensiveStringAsync()
    {
        // можно было бы добавить
        /* await */ Task.Yield();
        //
        Thread.Sleep(10000);
        return "Hello world";
    }
    
    1 авг 18, 14:52    [21621377]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    hVostt
    kealon(Ruslan)
  • как это всё выглядит изнутри плюсов:
    вызвали аснхронный метод, собственно он возвращает контракт IASync<T>
    и тут можно с ним делать что угодно: подождать вызвать другой метод и пр.

  • как это может быть в плане реализации асинхронного метода:
    тут куча вариантов: асинхронная функция ОС, запуск обёрнутой задачи в пул и пр. пр.


  • Из плюсов, да и в C# тоже, весь код, который генерит await можно написать и самостоятельно. Чудеса начинаются, когда среди кучи последовательных и вложенных await доходим до функций, выполняющих непосредственно I/O операции, которые и "отпускают" поток восвоясь. А когда результат будет получен, будет выдернут любой свободный поток, который продолжит выполнение оставшегося кода. Вот здесь суть, которую многие упускают, когда пытаются "на пальцах" строить свои объяснения того, как это устроено. Это и правда выглядит так, как будто оставшийся кусок метода после await тупо завернули в коллбек. Но это наивно так полагать.
    не выдумывайте, там обычный линейный код
    hVostt
    kealon(Ruslan)
    пропущено...
    ничего он не выдумывает, он просто вставляет код ожидания


    Куда вставляет? Кто код ожидания будет выполнять? Что там со стеком? Могу ли я ожидать огромное количество асинхронных операций, с небольшим количеством рабочих потоков?
    ожидание выполняет реализатор контракта IAsync<T>
    в частности с IO, для этого достаточно текущую нить отдать "планировщику" и переключиться на выполнение другой задачи.
    Можете
    1 авг 18, 14:57    [21621396]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Valery_B
    Member

    Откуда: Москва
    Сообщений: 1989
    hVostt,

    Для меня как раз наоборот - первый случай абсолютно очевиден, а второй - наоборот.
    Не понятно, что должна сделать эта процедура выполняя первый и второй оператор.
    И в каком потоке.

    private async void Button1Click(object sender, EventArgs e)
    {
        // а такое очевидно
        // и это асинхронный вызов!
        label1.Text = "Please wait";   
        label1.Text = GetExpensiveStringAsync();
    }
    
    1 авг 18, 15:02    [21621414]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    не выдумывайте, там обычный линейный код


    Да, там код. Это правда

    kealon(Ruslan)
    ожидание выполняет реализатор контракта IAsync<T>
    в частности с IO, для этого достаточно текущую нить отдать "планировщику" и переключиться на выполнение другой задачи.


    Вы не хотите разбираться как работает паттерн async/await, вообразили себе как он работает примитивным образом, окей. Спорить не буду, топик не об этом.

    Мне-то что хотите доказать? Я вопрос и проблемы в начале топика озвучил. Они не критичные, но с ними пришлось столкнуться.
    1 авг 18, 15:07    [21621434]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Valery_B
    Для меня как раз наоборот - первый случай абсолютно очевиден, а второй - наоборот.
    Не понятно, что должна сделать эта процедура выполняя первый и второй оператор.
    И в каком потоке.

    private async void Button1Click(object sender, EventArgs e)
    {
        // а такое очевидно
        // и это асинхронный вызов!
        label1.Text = "Please wait";   
        label1.Text = GetExpensiveStringAsync();
    }
    


    Это потому что вам это ещё пока не привычно.

    Посмотрите, что случилось, когда в Java ввели var, сколько воя и боли.
    Очевидно, что это упрощает написание и облегчает код, но некоторые сразу сказали, что им непонятно теперь какого типа переменные, var всё портит

    Здесь ситуация такая же. Мне достаточно, если асинхронные методы будут иметь суффикс Async, ну и IDE мог бы с лёгкостью подсвечивать асинхронные вызовы.

    Просто этого нет пока, надо вручную писать много await и это печалит.
    1 авг 18, 15:11    [21621456]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    hVostt
    Мне-то что хотите доказать? Я вопрос и проблемы в начале топика озвучил. Они не критичные, но с ними пришлось столкнуться.
    вы совершенно не понимаете как это работает, хуже того - вы себе что-то насочиняли

    исходя из второго у вас и весь вопрос

    на дуболомный вопрос MasterZiv-а у вас нет ответа

    а конкретно если у вас везде await, то что-то с вашим кодом не так

    по вашему
    AsyncMet1();
    AsyncMet2();
    


    должен преобразоваться в
    await AsyncMet1();
    await AsyncMet2();
    

    ну-ну...
    1 авг 18, 15:46    [21621635]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    kealon(Ruslan)
    по вашему
    AsyncMet1();
    AsyncMet2();
    


    должен преобразоваться в
    await AsyncMet1();
    await AsyncMet2();
    

    ну-ну...

    Если эти вызовы производятся из async-метода, то да, хотя бы один из этих двух вызовов должен быть с await, иначе сам метод будет выполняться синхронно (и это вполне логично).
    1 авг 18, 16:02    [21621696]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt,

    че то ты где то не понял :(
    async await {censored} не нужны
    Модератор: Просьба подбирать слова покультурнее


    Сообщение было отредактировано: 1 авг 18, 16:17
    1 авг 18, 16:05    [21621709]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >hVostt, сегодня, 15:11 [21621456]

    >... Мне достаточно, если асинхронные методы будут иметь суффикс Async, ну и IDE мог бы с лёгкостью подсвечивать асинхронные вызовы.

    <На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так:
    private async void ЗапросДанных() {
     . . .
     await Task.Run(() => wsp.Entity_SP("...
     . . .
    }
    
    1 авг 18, 16:12    [21621739]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >hVostt, сегодня, 15:11 [21621456]

    >... Мне достаточно, если асинхронные методы будут иметь суффикс Async, ну и IDE мог бы с лёгкостью подсвечивать асинхронные вызовы.

    <На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так:
    private async void ЗапросДанных() {
     . . .
     await Task.Run(() => wsp.Entity_SP("...
     . . .
    }
    
    1 авг 18, 16:13    [21621743]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    на дуболомный вопрос MasterZiv-а у вас нет ответа


    Если вы не разбираетесь в вопросе вместе с MasterZiv, в этом ничего плохого нет, не нужно вступать в полемику.


    kealon(Ruslan)
    а конкретно если у вас везде await, то что-то с вашим кодом не так

    по вашему
    AsyncMet1();
    AsyncMet2();
    



    должен преобразоваться в
    await AsyncMet1();
    await AsyncMet2();
    


    Мда.
    1 авг 18, 16:19    [21621761]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ViPRos
    hVostt,

    че то ты где то не понял :(
    async await {censored} не нужны


    В контексте твоих проектов, не особо нужны.
    1 авг 18, 16:20    [21621770]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ВМоисеев
    <На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так:
    private async void ЗапросДанных() {
     . . .
     await Task.Run(() => wsp.Entity_SP("...
     . . .
    }
    


    Но это не асинхронный вызов. Это асинхронное ожидание, в этом случае блокируется отдельно выделенный поток для абсолютно синхронного выполнения i/o операции.
    1 авг 18, 16:22    [21621776]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    ВМоисеев
    <На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так:
    private async void ЗапросДанных() {
     . . .
     await Task.Run(() => wsp.Entity_SP("...
     . . .
    }
    

    Компилятор мог бы для всех task-ов "докинуть" await, это не проблема... Проблема, если разработчику понадобиться более гибкая схема, например
    async ... Method()
    {
    task1.Start();
    task2.Start();
    await task1;
    }
    и где-то в другом месте
    task2.Wait();
    1 авг 18, 16:39    [21621828]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    LR
    Если эти вызовы производятся из async-метода, то да, хотя бы один из этих двух вызовов должен быть с await, иначе сам метод будет выполняться синхронно (и это вполне логично).
    нет (то что выдаются красивые варнинги - они не по этому поводу и ничего не меняют), просто потеряешь контроль над выполнением и без дополнительных танцев не узнаешь когда в действительности выполнятся оба метода.

    просто проверить не судьба я так понимаю ...
    1 авг 18, 16:53    [21621855]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    kealon(Ruslan)
    LR
    Если эти вызовы производятся из async-метода, то да, хотя бы один из этих двух вызовов должен быть с await, иначе сам метод будет выполняться синхронно (и это вполне логично).
    нет (то что выдаются красивые варнинги - они не по этому поводу и ничего не меняют), просто потеряешь контроль над выполнением и без дополнительных танцев не узнаешь когда в действительности выполнятся оба метода.

    просто проверить не судьба я так понимаю ...

    Мдя)) Почитать документацию и узнать что такое async-методы не судьба, я так понимаю...
    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/await
    An await expression does not block the thread on which it is executing. Instead, it causes the compiler to sign up the rest of the async method as a continuation on the awaited task. Control then returns to the caller of the async method. When the task completes, it invokes its continuation, and execution of the async method resumes where it left off.

    An await expression can occur only in the body of its enclosing method, lambda expression, or anonymous method, which must be marked with an async modifier. The term await serves as a keyword only in that context.
    1 авг 18, 17:08    [21621901]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    LR,

    +

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics;
    
    namespace ConsoleApp1
    {
        class c
        {
            async Task<int> t1(int m)
            {
                await Task.Delay(m);
                Console.Write("t1 = ");
                Console.WriteLine(m);
                return 0;
            }
            async Task<int> test(int m)
            {
                t1(m);
                t1(2 * m);
                return await t1(0);
            }
            async Task<long> testcall()
            {
                Stopwatch sw = Stopwatch.StartNew();
                await test(1000);
                return (sw.ElapsedMilliseconds);
            }
            public long Test2()
            {
                var d = testcall();
                d.Wait();
                return d.Result;
            }
    
        }
        class Program
        {
            static void Main(string[] args)
            {
                c a = new c();
                Console.WriteLine(a.Test2());
                Console.ReadKey();
            }
        }
    }
    

    t1 = 0
    18
    t1 = 1000
    t1 = 2000
    занятно, да?
    1 авг 18, 17:15    [21621923]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    LR
    Мдя)) Почитать документацию и узнать что такое async-методы не судьба, я так понимаю...
    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/await
    An await expression does not block the thread on which it is executing. Instead, it causes the compiler to sign up the rest of the async method as a continuation on the awaited task. Control then returns to the caller of the async method. When the task completes, it invokes its continuation, and execution of the async method resumes where it left off.

    An await expression can occur only in the body of its enclosing method, lambda expression, or anonymous method, which must be marked with an async modifier. The term await serves as a keyword only in that context.
    эта фраза никак не противоречит моим словам, просто понимаешь ты её неправильно
    1 авг 18, 17:17    [21621933]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    kealon(Ruslan)
    занятно, да?

    Ничего занятного. Асинхронный метод здесь нужен лишь в одном месте, и, разумеется, с await.
    +
        class c
        {
            async Task<int> t1(int m)
            {
                await Task.Delay(m);
                Console.Write("t1 = ");
                Console.WriteLine(m);
                return 0;
            }
            int test(int m)
            {
                t1(m);
                t1(2 * m);
                var t = t1(0);
                t.Wait();
                return t.Result;
            }
            long testcall()
            {
                Stopwatch sw = Stopwatch.StartNew();
                test(1000);
                return (sw.ElapsedMilliseconds);
            }
            public long Test2()
            {
                var d = testcall();
                return d;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                c a = new c();
                Console.WriteLine(a.Test2());
                Console.ReadKey();
            }
        }
    


    kealon(Ruslan)
    эта фраза никак не противоречит моим словам, просто понимаешь ты её неправильно

    Да уж, вижу)))
    1 авг 18, 17:45    [21622015]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    LR
    Асинхронный метод здесь нужен лишь в одном месте

    А, возможно, и не нужен вовсе... Смысл async-метода во фразе из приведенной цитаты: "When the task completes, it invokes its continuation, and execution of the async method resumes where it left off." Если никакого продолжения нет, или продолжение не использует результаты task-ов, то какой смысл городить async-метод?
    1 авг 18, 17:58    [21622055]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >hVostt, сегодня, 16:22 [21621776]

    >Но это не асинхронный вызов. Это асинхронное ожидание,...
    <Называйте как хотите, но вторя Вам - асинхронный вызов мне нужен, чтобы I/O операции не блокировали UI поток. Иногда асинхронные операции с базой данных только называются асинхронными (суффикс Async присутствует), на самом деле метод выполняется синхронно. Используемая конструкция реализует асинхронность(параллельность) выполнения I/O.
    1 авг 18, 18:07    [21622088]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    LR,

    <я не знаю как ставится смайл когда по лбу себя бьёшь>

    но
    LR
    Если никакого продолжения нет, или продолжение не использует результаты task-ов, то какой смысл городить async-метод?
    направление мыслей уже правильное
    глядишь уже сможешь понять21619662
    1 авг 18, 18:32    [21622146]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    kealon(Ruslan)
    направление мыслей уже правильное
    глядишь уже сможешь понять21619662

    угу, читаем посыл
    MasterZiv
    Тебе вообще зачем __асинхронный__ вызов нужен?
    Наверное, чтобы он выполнялся параллельно с остальным кодом...
    А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?

    еще раз (а лучше два или три) перечитываем (эту гребаную) документацию
    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/await
    An await expression does not block the thread on which it is executing...

    и думаем...думаем...думаем...
    1 авг 18, 19:28    [21622264]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Мдя)) Почитать документацию и узнать что такое async-методы не судьба, я так понимаю...
    \

    Судя по наивным и глупым мессаджам kealon(Ruslan), это вообще тёмный лес.

    Я понимаю, даже не удосужился почитать, не имел дела, да и понятия не имеет о чём идёт речь, но своё однозначное мнение имеет
    1 авг 18, 19:31    [21622267]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 14154
    kealon(Ruslan)
    глядишь уже сможешь понять21619662

    Там слишком глубокий вопрос. В C# все прозаически банально: async/await надо для отзывчивости гуя. Чтобы клик по кнопке не завесил прогу. По встрече await дальнейший код уходит в другой поток, освобождается поток обработки сообщений, тот принимает следующее сообщение виндовса и т.д. Плюсом await дает написать хорошо читаемый код, т.е. синтаксический сахар в чистом виде.

    В остальном от async/await пользы не много. Я консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync().
    1 авг 18, 19:35    [21622272]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ВМоисеев
    Называйте как хотите, но вторя Вам - асинхронный вызов мне нужен, чтобы I/O операции не блокировали UI поток.


    Это можно сделать и без await. Это делали 10 лет назад в тех же винформсах. Поэтому это за рамками топика.


    ВМоисеев
    Используемая конструкция реализует асинхронность(параллельность) выполнения I/O.


    Нет, I/O здесь выполняется синхронно, в синхронном коде. Вы просто реализуете асинхронное ожидание результата. Но если так нравится, используйте ради бога, но это немного за рамками топике.
    1 авг 18, 19:36    [21622273]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    направление мыслей уже правильное
    глядишь уже сможешь понять21619662


    Вот эти глупости может прекратите копипастить?
    1 авг 18, 19:36    [21622277]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Dima T
    Там слишком глубокий вопрос. В C# все прозаически банально: async/await надо для отзывчивости гуя. Чтобы клик по кнопке не завесил прогу. По встрече await дальнейший код уходит в другой поток, освобождается поток обработки сообщений, тот принимает следующее сообщение виндовса и т.д. Плюсом await дает написать хорошо читаемый код, т.е. синтаксический сахар в чистом виде.

    В остальном от async/await пользы не много. Я консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync().


    У вас что, патологическая неприязнь к литературе, к справочным материалам? Вы хотя бы почитайте на оф. сайте, я уж не говорю о какой-либо практике.

    Прозаически банально это в вашем воображении. Нет, async/await нужен вовсе не только для отзывчивости гуя, это прекрасно решали ещё 10 лет назад, существует как минимум 2 асинхронных API, до появления TAP. Но я сомневаюсь, что вы о них вообще слышали.
    1 авг 18, 19:39    [21622286]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Dima T
    Я консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync().


    Ну ясно. Если практика этим заканчивается, async/await вообще здесь не к месту.
    1 авг 18, 19:43    [21622290]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    еще раз (а лучше два или три) перечитываем (эту гребаную) документацию
    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/await
    An await expression does not block the thread on which it is executing...

    и думаем...думаем...думаем...


    Это бессмысленно. Если человек себе что-то в голову вбил, и забил на документацию, это бессмысленно.

    Я честно говоря, вообще в глубоком шоке.
    Не думал, что придётся столкнуться с подобным невежеством.
    1 авг 18, 19:45    [21622293]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 14154
    hVostt
    существует как минимум 2 асинхронных API, до появления TAP. Но я сомневаюсь, что вы о них вообще слышали.

    Слышал, т.е. читал :)
    1 авг 18, 20:00    [21622311]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    LR
    MasterZiv
    Тебе вообще зачем __асинхронный__ вызов нужен?
    Наверное, чтобы он выполнялся параллельно с остальным кодом...
    А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?

    еще раз (а лучше два или три) перечитываем (эту гребаную) документацию
    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/await
    An await expression does not block the thread on which it is executing...

    и думаем...думаем...думаем...
    банальная фраза, она говорит что когда твоя задача занята ожиданием в await, нет никаких гарантий что она блокирует исполняющий её поток и он не может в это время заниматься какими-то другими делами


    hVostt
    Я честно говоря, вообще в глубоком шоке.
    Не думал, что придётся столкнуться с подобным невежеством.
    достаточно посмотреть в отладчике нативные вызовы WinRT что бы всё встало на свои места

    а уж потом изучать патерны
    1 авг 18, 20:01    [21622312]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 14154
    Топик ушел в сторону обсуждения реализации async/await в .net, как оно на других ЯП никто не пишет, поэтому топик переезжает в профильный форум.

    Модератор: Тема перенесена из форума "Программирование".


    Сообщение было отредактировано: 1 авг 18, 20:04
    1 авг 18, 20:04    [21622315]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    банальная фраза, она говорит что когда твоя задача занята ожиданием в await, нет никаких гарантий что она блокирует исполняющий её поток и он не может в это время заниматься какими-то другими делами


    судя по формулировке "занята ожиданием" пока дошло не до конца :)


    kealon(Ruslan)
    достаточно посмотреть в отладчике нативные вызовы WinRT что бы всё встало на свои места

    а уж потом изучать патерны


    при чём тут ваши нативные вызовы из WinRT, если async/await это конструкция языка, вы в отладчике await собрались искать?
    1 авг 18, 20:26    [21622348]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Dima T
    Топик ушел в сторону обсуждения реализации async/await в .net, как оно на других ЯП никто не пишет, поэтому топик переезжает в профильный форум.


    а так-то однопоточный JavaScript напрямую противоречит первому же ответу в топике
    но.. топик охватывает все языки, реализующие паттерн async/await.
    1 авг 18, 20:33    [21622358]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 14154
    hVostt
    Dima T
    Я консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync().


    Ну ясно. Если практика этим заканчивается, async/await вообще здесь не к месту.

    Т.е. ты признаешь что async/await не везде уместны? Тогда уточни где они уместны. Я один кейс обозначил - гуй, а еще где?
    1 авг 18, 20:37    [21622362]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Siemargl
    Member [заблокирован]

    Откуда: 010100
    Сообщений: 6330
    hVostt
    MasterZiv
    Тебе вообще зачем __асинхронный__ вызов нужен?
    Наверное, чтобы он выполнялся параллельно с остальным кодом...
    А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?


    Похоже, вы очень сильно путаете понятия.
    Вот вам ссылка почитать

    Вкратце, асинхронный вызов мне нужен, чтобы I/O операции не блокировали рабочий поток из пула. Запуск подобного ожидания в параллельном потоке, это костыль, не решающий проблемы, но позволяющий, например, не блокировать единственный UI поток. В контексте серверных веб-приложений, подобный финт ушами вообще бесмысленнен. А в контексте, например, JavaScript и вовсе невозможен (не будем брать в расчёт не так давно появившиеся Web Workers).

    В общем, вернёмся к вопросу. Уточню, откуда ноги растут у вопроса. Проблемы две:

    1. избыточность повсеместного ключевого слова await, если есть какое-то подозрение, что код модуля будет исполнять асинхронные методы, он тоже должен быть асинхронным.

    2. забыли await, получили проблемы, особенно, если мы не ожидаем результат, а только сам факт асинхронного исполнения (async void).

    А ты уверен, что в текущих ОС, концепция async/await реализуема без многопоточки ?

    Мне кажется, что на этом шатком основании ты пытаешься что то доказать.
    1 авг 18, 20:43    [21622371]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Siemargl
    Member [заблокирован]

    Откуда: 010100
    Сообщений: 6330
    Это я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена.

    С т.зрения Яваскриптера все вокруг это только браузер
    1 авг 18, 20:44    [21622376]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Dima T
    Т.е. ты признаешь что async/await не везде уместны? Тогда уточни где они уместны. Я один кейс обозначил - гуй, а еще где?


    В гуе тоже постольку поскольку.

    Уместны там, где интенсивно и в большом количестве используются асинхронные операции: доступ к БД, веб-запросы, работа с файлами.

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

    На собственном примере, у нас года 3 назад было разработано веб-приложение. В период пиковых нагрузок оно падало на одном сервере. Пришлось масштабировать его на несколько серверов, чтобы решить проблему.

    Мы переписали код на использование async/await, логика и всё остальное осталось неизменным. В период следующих пиковых нагрузок, один единственный сервер уже с лёгкостью справлялся, хотя нагрузка даже увеличилась.

    Это из практики.

    Всё это хорошо, за исключением обозначенных мною проблем в начале топика.
    1 авг 18, 20:52    [21622383]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Siemargl
    А ты уверен, что в текущих ОС, концепция async/await реализуема без многопоточки ?


    А при чём тут многопоточка? Один или много потоков, async/await позволяет не блокировать их на время работы i/o операций, в этом основной смысл.


    Siemargl
    Мне кажется, что на этом шатком основании ты пытаешься что то доказать.


    Тебе не просто кажется, это какие-то фантазии. Я ничего не пытаюсь доказать, я озвучил проблемы. Но как оказалось, народ в большинстве даже не понимает что это такое и с чем это едят.
    1 авг 18, 20:54    [21622384]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Siemargl
    Это я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена.


    Верно, поэтому хотелось бы в прикладном коде работать с асинхронными вызовами и не задумываться о том, что они асинхронные. Сейчас приходится вставлять await. А я уверен, что без этого можно было бы обойтись :)
    1 авг 18, 20:55    [21622386]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >hVostt, сегодня, 19:36 [21622273]
    >Нет, I/O здесь выполняется синхронно, в синхронном коде. Вы просто реализуете асинхронное ожидание результата…
    <Я видимо что-то не понимаю, вот код:
    при.tmrStart(); await Task.Run(() => wsp.Entity_SP("NCUYAO_GIS.VD_Inspek_Sel", wsp.sp_Sel, psp, RowToEntity)); при.tmrStop();

    запрос выполняется параллельно с демонстрацией прогресбара
    1 авг 18, 21:24    [21622438]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ВМоисеев
    запрос выполняется параллельно с демонстрацией прогресбара


    Запрос выполняется синхронно в параллельном потоке. Так как у вас десктопное приложение, которое выполняется монопольно для одного единственного пользователя, вы можете использовать потоки для реализации асинхронного поведения при запросах к БД, при условии, что их относительно не много, и нисколько не пострадать от этого.
    1 авг 18, 21:30    [21622464]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Siemargl
    Member [заблокирован]

    Откуда: 010100
    Сообщений: 6330
    hVostt
    Siemargl
    Это я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена.


    Верно, поэтому хотелось бы в прикладном коде работать с асинхронными вызовами и не задумываться о том, что они асинхронные. Сейчас приходится вставлять await. А я уверен, что без этого можно было бы обойтись :)
    Ты плачешь, что синтакс сахар недостаточно сладкий?!
    1 авг 18, 23:20    [21622840]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Siemargl
    Member [заблокирован]

    Откуда: 010100
    Сообщений: 6330
    Компьютер/компилятор тупой, подсказка с твоей стороны с await может только улучшить его работу.

    Например представь, что он попытается параллелить все операции (а почему бы и нет - выч блоков то у ЦПУ много)
    1 авг 18, 23:25    [21622860]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Siemargl
    Member [заблокирован]

    Откуда: 010100
    Сообщений: 6330
    например, все лямбды без захвата по ссылке можно запускать асинхронно. а вот выгодно ли ?

    рановато еще, не доросли компилеры
    1 авг 18, 23:41    [21622909]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    hVostt
    kealon(Ruslan)
    достаточно посмотреть в отладчике нативные вызовы WinRT что бы всё встало на свои места

    а уж потом изучать патерны


    при чём тут ваши нативные вызовы из WinRT, если async/await это конструкция языка, вы в отладчике await собрались искать?
    А вы сходства не видите между WinRT и Net? подставка кода под неочевидные конструкции языка называется compiler magic.
    под отладчиком я понимаю WinDbg.

    hVostt
    На собственном примере, у нас года 3 назад было разработано веб-приложение. В период пиковых нагрузок оно падало на одном сервере. Пришлось масштабировать его на несколько серверов, чтобы решить проблему.

    Мы переписали код на использование async/await, логика и всё остальное осталось неизменным. В период следующих пиковых нагрузок, один единственный сервер уже с лёгкостью справлялся, хотя нагрузка даже увеличилась.
    профит получили, а откуда не поняли
    тут очень хорошо разжёвывают за счёт чего работают такие вещи

    hVostt
    а так-то однопоточный JavaScript напрямую противоречит первому же ответу в топике
    но.. топик охватывает все языки, реализующие паттерн async/await.
    никак не противоречит, но об этом пока говорить рано

    PS: Вера это конечно прикольно, но при споре об устройстве системы с системщиком её одной мало. Cкрины из системного отладчика были бы гораздо убедительнее
    2 авг 18, 00:43    [21622981]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    Мы переписали код на использование async/await, логика и всё остальное осталось неизменным. В период следующих пиковых нагрузок, один единственный сервер уже с лёгкостью справлялся, хотя нагрузка даже увеличилась.
    у меня не вышло оставить логику.
    Унаследованный проект и вызов бд, сервиса был глубоко в стеке из 10 методов.
    А await требует выхода сразу наверх из стека.
    Т.е. он не запоминает код выше уровнем чтобы его потом продолжить. Только в этом же методе.
    Пришлось убирать стек и переписать все 10 методов(.
    Прискорбно.
    2 авг 18, 07:24    [21623093]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Siemargl
    Ты плачешь, что синтакс сахар недостаточно сладкий?!


    Я вроде озвучил проблемы в начале топика.
    2 авг 18, 07:31    [21623098]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Siemargl
    Компьютер/компилятор тупой, подсказка с твоей стороны с await может только улучшить его работу.

    Например представь, что он попытается параллелить все операции (а почему бы и нет - выч блоков то у ЦПУ много)


    Он не пытается распараллелить async/await, это про другое.
    2 авг 18, 07:38    [21623102]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Siemargl
    например, все лямбды без захвата по ссылке можно запускать асинхронно. а вот выгодно ли ?
    рановато еще, не доросли компилеры


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

    код с async/await с точки зрения потока исполнения не имеет ничего общего с параллелизмом.
    поэтому вы не можете, например, использовать блокировки потока. только семафоры.
    2 авг 18, 07:40    [21623105]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    А вы сходства не видите между WinRT и Net? подставка кода под неочевидные конструкции языка называется compiler magic.
    под отладчиком я понимаю WinDbg.


    Вы хотя бы сами понимаете, какую мысль вы пытаетесь мне втереть?

    kealon(Ruslan)
    профит получили, а откуда не поняли
    тут очень хорошо разжёвывают за счёт чего работают такие вещи


    Достали вы меня, в C++ есть async/await? Нету. В С++ можно писать асинхронный код? Можно. И в C# можно было до появления async/await. Вы до сих пор не удосужились почитать ни одного материала по async/await, всё продолжаете смачно фантазировать и отнимать у людей время своими бессмысленными набросами.

    Можете ясно и чётко выразить свою мысль? Вы чего хотите донести? Я исходные данные в начале топика озвучил, при чём тут ваша отладка, при чём тут C++?

    Вы хотите сказать, что async/await это бессмысленная конструкция? Помятуя ответ в этом топике от MasterZiv, на который вы неоднократно ссылались, это выглядит так. Ну тогда для чего этот паттерн ввели в нескольких языках? Может они просто тупые и вас забыли спросить? Ну не смешите людей уже своими глупостями. Либо выражайтесь яснее, либо не отнимайте время у людей.

    kealon(Ruslan)
    никак не противоречит, но об этом пока говорить рано


    Рано, потому что вы ещё не почитали и не ознакомились с информацией? Ну подождём, че уж.

    kealon(Ruslan)
    PS: Вера это конечно прикольно, но при споре об устройстве системы с системщиком её одной мало. Cкрины из системного отладчика были бы гораздо убедительнее


    Вы похожи на бабку возле подъезда, которая с ходу ставит точный диагноз любому проходящему мимо мужчине или женщине. Нашли же себе занятие. Детский сад.
    2 авг 18, 07:48    [21623110]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Petro123
    у меня не вышло оставить логику.
    Унаследованный проект и вызов бд, сервиса был глубоко в стеке из 10 методов.


    Древний легаси исправить на использование a/a почти невозможно, нужно всё переписывать :)

    Но у нас был не древний легаси, при написании была выстроена вменяемая архитектура, позволяющая это сделать, тогда уже задумывались о переходе на async-first, но не решались. А потом решились.

    Сейчас проекты пишутся async-first. Всё хорошо. Раньше использовать асинхронность было тяжело из-за неудобного апи, поэтому большинство забило на это болт и просто запускали потоки. Сейчас стало возможно писать такой код в полный рост, но вылезли две проблемы, о которых я напомню:

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

    2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично.

    3. (опционально) некоторым не нравится, что отлаживаться под async/await сложнее, чем с синхронным кодом. но это потому что они до этого вообще не работали с асинхронным кодом, раньше было ещё сложнее :) но обещают улучшить ситуацию, правда меня это особо не трогает.
    2 авг 18, 08:18    [21623154]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    hVostt
    Достали вы меня, в C++ есть async/await? Нету. В С++ можно писать асинхронный код? Можно. И в C# можно было до появления async/await. Вы до сих пор не удосужились почитать ни одного материала по async/await, всё продолжаете смачно фантазировать и отнимать у людей время своими бессмысленными набросами.

    Можете ясно и чётко выразить свою мысль? Вы чего хотите донести? Я исходные данные в начале топика озвучил, при чём тут ваша отладка, при чём тут C++?

    Вы хотите сказать, что async/await это бессмысленная конструкция? Помятуя ответ в этом топике от MasterZiv, на который вы неоднократно ссылались, это выглядит так. Ну тогда для чего этот паттерн ввели в нескольких языках? Может они просто тупые и вас забыли спросить? Ну не смешите людей уже своими глупостями. Либо выражайтесь яснее, либо не отнимайте время у людей.

    утверждение MasterZiv построено от противного, он чётко выводит "так нафига они тогда нужны?", а ответа у вас нету

    если копаться в кишка всей этой конструкции:
  • в .Net и WinRT метод помеченный async это контракт на поставку интерфейса IAsync<t>
  • для метода помеченного как async компилятор делает "загрузочный" стаб, на экспорт идёт загрузочный стаб
  • await это лишь синтаксический сахар, который вызывает IAsync<t>.Wait (попутные действия пока пропустим)
  • реализация IAsync<t>.Wait полностью лежит на функции которая его вернула

    что непонятно? с чем не согласны?
  • 2 авг 18, 08:22    [21623166]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 14154
    Полистал Рихтера "CLR via C# 4-е издание" Глава 28. Асинхронные операции ввода-вывода.
    Подробно разжевано как устроены async/await (целиком читал 3-е издание, надо уже собраться и это прочитать)

    Под капотом асинхронного IO .net использует надстройку над виндовым I/O Completion Port. По ссылке подробно расписано как он устроен.
    Если кратко: виндовсу дается задание на чтение или запись и освобождается текущий поток, как только задание выполняется, виндовс будит один из потоков-обработчиков из заранее созданного пула.
    2 авг 18, 08:28    [21623176]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Siemargl
    Member [заблокирован]

    Откуда: 010100
    Сообщений: 6330
    hVostt
    Достали вы меня, в C++ есть async/await? Нету.

    Вообще то есть. Сделано через концепцию future/promise
    2 авг 18, 08:31    [21623190]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    утверждение MasterZiv построено от противного, он чётко выводит "так нафига они тогда нужны?", а ответа у вас нету


    Вот с фига ли вы взяли, что ответа у меня нет? Это что, вы так дурака включаете, или просто не читаете, или у у вас проблемы с памятью?

    Как объяснить вашу ахинею?

    Я написал следующим же ответом 21619690 и ссылку приложил и потом ещё неоднократно давал объяснения, вы почему так вообще говорите? Что за манеры у вас дебильные?


    kealon(Ruslan)
    если копаться в кишка всей этой конструкции:
  • в .Net и WinRT метод помеченный async это контракт на поставку интерфейса IAsync<t>
  • для метода помеченного как async компилятор делает "загрузочный" стаб, на экспорт идёт загрузочный стаб
  • await это лишь синтаксический сахар, который вызывает IAsync<t>.Wait (попутные действия пока пропустим)
  • реализация IAsync<t>.Wait полностью лежит на функции которая его вернула

    что непонятно? с чем не согласны?


  • Ну во-первых. В .net async - это не контракт, и в других языках, где применяется async/await тоже.
    Во-вторых. Для работы await метод должен возвращать объект с методом GetAwaiter, у которого нет метода Wait, или чего-то похожего.

    Вы до сих пор не понимаете как работает async/await. Но это не важно.

    Вы видели мой вопрос в начале топика? Я говорил где-то, а давайте обсудим сам паттерн, нужен ли он вообще, как он устроен, чё там видно в дебагере и т.п.? Может хватит офтопить? Или давайте заведём отдельную тему, где обсудим эти вопросы?
    2 авг 18, 08:38    [21623220]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Dima T
    Полистал Рихтера "CLR via C# 4-е издание" Глава 28. Асинхронные операции ввода-вывода.
    Подробно разжевано как устроены async/await (целиком читал 3-е издание, надо уже собраться и это прочитать)

    Под капотом асинхронного IO .net использует надстройку над виндовым I/O Completion Port. По ссылке подробно расписано как он устроен.
    Если кратко: виндовсу дается задание на чтение или запись и освобождается текущий поток, как только задание выполняется, виндовс будит один из потоков-обработчиков из заранее созданного пула.


    Ну слава те хоспади! :)

    Только эта же реализация использовалась и ранее, на устаревшем асинхронном API (APM, EAP), просто из-за её неудобств, абсолютное большинство вообще не знали что это такое и как этим пользоваться. Просто запускали фоновые потоки для асинхронного поведения.
    2 авг 18, 08:41    [21623224]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Siemargl
    hVostt
    Достали вы меня, в C++ есть async/await? Нету.

    Вообще то есть. Сделано через концепцию future/promise


    Это другой паттерн.
    2 авг 18, 08:42    [21623226]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    hVostt
    kealon(Ruslan)
    утверждение MasterZiv построено от противного, он чётко выводит "так нафига они тогда нужны?", а ответа у вас нету


    Вот с фига ли вы взяли, что ответа у меня нет? Это что, вы так дурака включаете, или просто не читаете, или у у вас проблемы с памятью?

    Как объяснить вашу ахинею?

    Я написал следующим же ответом 21619690 и ссылку приложил и потом ещё неоднократно давал объяснения, вы почему так вообще говорите? Что за манеры у вас дебильные?

    упустим ваши современные английские манеры

    hVostt
    kealon(Ruslan)
    если копаться в кишка всей этой конструкции:
  • в .Net и WinRT метод помеченный async это контракт на поставку интерфейса IAsync<t>
  • для метода помеченного как async компилятор делает "загрузочный" стаб, на экспорт идёт загрузочный стаб
  • await это лишь синтаксический сахар, который вызывает IAsync<t>.Wait (попутные действия пока пропустим)
  • реализация IAsync<t>.Wait полностью лежит на функции которая его вернула

    что непонятно? с чем не согласны?
  • Ну во-первых. В .net async - это не контракт, и в других языках, где применяется async/await тоже.
    Во-вторых. Для работы await метод должен возвращать объект с методом GetAwaiter, у которого нет метода Wait, или чего-то похожего.

    Вы до сих пор не понимаете как работает async/await. Но это не важно.

    Вы видели мой вопрос в начале топика? Я говорил где-то, а давайте обсудим сам паттерн, нужен ли он вообще, как он устроен, чё там видно в дебагере и т.п.? Может хватит офтопить? Или давайте заведём отдельную тему, где обсудим эти вопросы?

    я их с натива дёргаю, а ты говоришь что это всё мистика, ты адекватный?
    2 авг 18, 08:55    [21623252]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Siemargl
    Member [заблокирован]

    Откуда: 010100
    Сообщений: 6330
    hVostt
    Siemargl
    пропущено...
    Вообще то есть. Сделано через концепцию future/promise

    Это другой паттерн.
    Я смотрю MSIL и вижу ту же самую реализацию.


    Давай еще раз. Ты сначала пишешь.
    hVostt
    Думаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

    Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?
    ..
    И потом
    hVostt
    2. забыли await, получили проблемы, особенно, если мы не ожидаем результат, а только сам факт асинхронного исполнения (async void).


    Так нужен тебе await или не нужен ?

    Приведи что ли кусок кода, где ты считаешь его ненужным.
    2 авг 18, 09:07    [21623270]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Алексей К
    Member

    Откуда: Новосибирск
    Сообщений: 13633
    hVostt
    2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично.
    Есть
    2 авг 18, 09:42    [21623364]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt,

    Как тут компилятору узнать куда надо await сунуть?

    // Three things to note in the signature: 
    //  - The method has an async modifier.  
    //  - The return type is Task or Task<T>. (See "Return Types" section.)
    //    Here, it is Task<int> because the return statement returns an integer. 
    //  - The method name ends in "Async."
    async Task<int> AccessTheWebAsync()
    { 
        // You need to add a reference to System.Net.Http to declare client.
        HttpClient client = new HttpClient();
    
        // GetStringAsync returns a Task<string>. That means that when you await the 
        // task you'll get a string (urlContents).
        Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
    
        // You can do work here that doesn't rely on the string from GetStringAsync.
        DoIndependentWork();
    
        // The await operator suspends AccessTheWebAsync. 
        //  - AccessTheWebAsync can't continue until getStringTask is complete. 
        //  - Meanwhile, control returns to the caller of AccessTheWebAsync. 
        //  - Control resumes here when getStringTask is complete.  
        //  - The await operator then retrieves the string result from getStringTask. 
        string urlContents = await getStringTask;
    
        // The return statement specifies an integer result. 
        // Any methods that are awaiting AccessTheWebAsync retrieve the length value. 
        return urlContents.Length;
    }
    
    2 авг 18, 09:55    [21623411]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    можно :(
    2 авг 18, 09:59    [21623427]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Агнец за бортом
    Member

    Откуда:
    Сообщений: 1318
    hVostt
    Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её,


    Ну так а какие аргументы еще нужны?

    Код либо ждем (await)
    Либо не ждём (без await) - по каким то причинам. Например - потом подождём.

    Ну и всё. )
    2 авг 18, 10:06    [21623445]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    kealon(Ruslan)
    упустим ваши современные английские манеры


    Не нужно писать, что у меня нет ответа, когда я его давал и не однократно.
    Если это по-вашему офигеть какие адекватные манеры, то для вас у меня плохие новости.

    kealon(Ruslan)
    я их с натива дёргаю, а ты говоришь что это всё мистика, ты адекватный?


    В нативе нет никаких async/await, в чём ваша проблема, не пойму?
    2 авг 18, 10:10    [21623466]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Siemargl
    Я смотрю MSIL и вижу ту же самую реализацию.


    Приведите код и давайте посмотрим на MSIL. Не знаю чего вы там видите.


    Siemargl
    Так нужен тебе await или не нужен ?


    Мне нужен await, но считаю, что использование ключевого слова в большинстве случаев избыточно.
    2 авг 18, 10:11    [21623472]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Алексей К
    hVostt
    2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично.
    Есть


    Ок, сейчас проверим.
    2 авг 18, 10:12    [21623478]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt,

    наверное всегда избыточно
    await можно поставить автоматом всегда (ну, вроде как)
    2 авг 18, 10:13    [21623482]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Агнец за бортом
    Ну так а какие аргументы еще нужны?

    Код либо ждем (await)
    Либо не ждём (без await) - по каким то причинам. Например - потом подождём.

    Ну и всё. )


    В смысле, потом? )
    2 авг 18, 10:13    [21623484]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ViPRos
    hVostt,

    наверное всегда избыточно
    await можно поставить автоматом всегда (ну, вроде как)


    Я тоже так думаю, благодаря ключевому слову async для блока метода, компилятор понимает, что тело может содержать асинхронные вызовы.
    2 авг 18, 10:14    [21623489]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Я тоже так думаю, благодаря ключевому слову async для блока метода, компилятор понимает, что тело может содержать асинхронные вызовы.

    Может, но необязательно содержит, кроме того, метод может возвращать Task, но не содержать асинхронных вызовов и ключевого слова asynс
    А еще может понадобиться запустить асинхронный метод и не ждать его окончания.
    А еще есть async void - асинхронные методы, которые не получится ждать
    2 авг 18, 10:17    [21623504]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt
    ViPRos
    hVostt,

    наверное всегда избыточно
    await можно поставить автоматом всегда (ну, вроде как)


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

    Это необходимо, но недостаточно.
    2 авг 18, 10:20    [21623514]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    Нужен еще анализ - есть ли обращение к TaskResult где нить
    2 авг 18, 10:22    [21623527]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    И воще еще раз возвращаюсь к тому что надо было явно выделить (не через соглашение, а как свойство таск) I/O Port таски и тогда не было бы путаницы этой и не надо было писать асунк-авайт вообще
    2 авг 18, 10:26    [21623542]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Алексей К
    hVostt
    2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично.
    Есть


    Проверил, верно, нужно добавить в CSPROJ

    <WarningsAsErrors>CS4014,CS1998</WarningsAsErrors>
    


    Это снимает проблему №2 :)
    2 авг 18, 10:26    [21623543]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    Может, но необязательно содержит, кроме того, метод может возвращать Task, но не содержать асинхронных вызовов и ключевого слова asynс
    А еще может понадобиться запустить асинхронный метод и не ждать его окончания.
    А еще есть async void - асинхронные методы, которые не получится ждать


    Поэтому нужен контракт, хотя бы атрибут для методов интерфейса.
    Вообще, конечно, можно задействовать Fody и добиться желаемого, но это капец плохая идея :)

    Насчёт async void, ща так делать моветон :)
    2 авг 18, 10:30    [21623554]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ViPRos
    Нужен еще анализ - есть ли обращение к TaskResult где нить


    Ну это без разницы же.

    ViPRos
    И воще еще раз возвращаюсь к тому что надо было явно выделить (не через соглашение, а как свойство таск) I/O Port таски и тогда не было бы путаницы этой и не надо было писать асунк-авайт вообще


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

    Например, правайдер оракла до сих пор не умеет async. Поэтому вызовы нужно оборачивать в Task.Run, чтобы интерфейсы не ломать.
    2 авг 18, 10:32    [21623563]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt
    Агнец за бортом
    Ну так а какие аргументы еще нужны?

    Код либо ждем (await)
    Либо не ждём (без await) - по каким то причинам. Например - потом подождём.

    Ну и всё. )


    В смысле, потом? )

    Никто же не запретит использовать к примеру такую "конструкцию"
    object x;
    async void Dosmth()
    {
        Meth1async();
        x = Meth2async();
    }
    

    компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто...
    2 авг 18, 10:33    [21623568]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Насчёт async void, ща так делать моветон :)
    Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий.
    2 авг 18, 10:34    [21623570]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    LR
    hVostt
    пропущено...


    В смысле, потом? )

    Никто же не запретит использовать к примеру такую "конструкцию"
    object x;
    async void Dosmth()
    {
        Meth1async();
        x = Meth2async();
    }
    

    компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто...

    Не просто, но можно
    2 авг 18, 10:36    [21623579]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt
    ViPRos
    Нужен еще анализ - есть ли обращение к TaskResult где нить


    Ну это без разницы же.


    Как без разницы? А если запустил и забыл? Разве тут нужен await? (я только читал, не писал)
    2 авг 18, 10:37    [21623584]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Агнец за бортом
    Member

    Откуда:
    Сообщений: 1318
    hVostt
    Агнец за бортом
    Ну так а какие аргументы еще нужны?

    Код либо ждем (await)
    Либо не ждём (без await) - по каким то причинам. Например - потом подождём.

    Ну и всё. )


    В смысле, потом? )


    Ты сам сказал, собрать всё в коллекцию и дождаться их парралельно.
    2 авг 18, 10:39    [21623592]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    ViPRos
    Не просто, но можно

    Ну, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task - сможет ли компилятор отследить все лабиринты мысли хитроумного разработчика?
    2 авг 18, 10:42    [21623602]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    LR
    ViPRos
    Не просто, но можно

    Ну, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task - сможет ли компилятор отследить все лабиринты мысли хитроумного разработчика?

    во всяком случае я бы мог это прогить :)
    2 авг 18, 10:45    [21623620]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Никто же не запретит использовать к примеру такую "конструкцию"
    object x;
    async void Dosmth()
    {
        Meth1async();
        x = Meth2async();
    }
    


    компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто...


    Пока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :)
    2 авг 18, 10:52    [21623660]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    hVostt
    Насчёт async void, ща так делать моветон :)
    Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий.


    Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)
    2 авг 18, 10:53    [21623663]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ViPRos
    Как без разницы? А если запустил и забыл? Разве тут нужен await? (я только читал, не писал)


    "Запустил и забыл" нужно делать через управляемый менеджер задач, в самом примитивном случае, Task.Run.
    Но это по фуншую )
    2 авг 18, 10:54    [21623668]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt
    LR
    Никто же не запретит использовать к примеру такую "конструкцию"
    object x;
    async void Dosmth()
    {
        Meth1async();
        x = Meth2async();
    }
    


    компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто...


    Пока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :)

    Это не очевидно
    2 авг 18, 10:54    [21623669]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt
    Пока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :)

    LR
    Ну, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task
    2 авг 18, 10:54    [21623670]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Агнец за бортом
    Ты сам сказал, собрать всё в коллекцию и дождаться их парралельно.


    Да, здесь требуется ручное управление, поэтому нужен специальный синтаксис для таких довольно редких случаев. Я не думал пока об этом )
    2 авг 18, 10:56    [21623678]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ViPRos
    Это не очевидно


    Почему? Вроде очевидно.
    2 авг 18, 10:56    [21623681]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt,

    все это можно разрулить автоматом
    2 авг 18, 10:57    [21623686]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Ну, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task


    Тогда никак, только ручной await. Ну это совсем дикие примеры )
    2 авг 18, 10:57    [21623690]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt
    ViPRos
    Это не очевидно


    Почему? Вроде очевидно.

    нет
    там await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет)
    2 авг 18, 10:58    [21623694]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ViPRos
    hVostt,

    все это можно разрулить автоматом


    Ну смотри. Если ты хочешь предоставить прикладным разработчикам некий DSL, тебе не захочется объяснять им, что если вы хотите запросить данные, вам надо это делать через жопу через некий промис, или коллбек, и оставшийся код надо поместить в коллбек, или не забудьте сделать await. И вообще сломать им голову, итак забитой под завязку предметкой.

    Да, придётся рулить автоматом.
    2 авг 18, 10:59    [21623703]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ViPRos
    там await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет)


    Приведение должно быть типа таким (async Task), потому что Task ещё не говорит об асинхронности.
    2 авг 18, 11:00    [21623709]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt
    ViPRos
    там await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет)


    Приведение должно быть типа таким (async Task), потому что Task ещё не говорит об асинхронности.

    по любому, только приведение скажет - нежен await или нет
    2 авг 18, 11:01    [21623722]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    вощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно
    или косвенно await не нужен)
    2 авг 18, 11:04    [21623730]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    ViPRos
    вощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно
    или косвенно await не нужен)

    Тогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен)))
    2 авг 18, 11:09    [21623757]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Тогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен)))


    Да простого приведения было бы достаточно :)

    Это как я всё жду, когда для ссылочных типов будет можно написать так:

    string ! s = "blablabla";
    s = null; // ERROR!
    


    т.е. есть тип string и string! по аналогии int и int?
    или наоборот string и string?

    так же и с асинком (async Task)value и (Task)value, взяли и скрыли async от компилятора :)
    2 авг 18, 11:12    [21623766]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    LR
    ViPRos
    вощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно
    или косвенно await не нужен)

    Тогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен)))

    угу
    2 авг 18, 11:14    [21623780]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Следующий вопрос, может кто решал.

    Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)
    2 авг 18, 11:17    [21623810]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)
    замена в исходниках по регулярке )))
    2 авг 18, 11:29    [21623894]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    Shocker.Pro
    пропущено...
    Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий.


    Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)
    нет.
    У меня проект, где я в цикле делаю await и результат мне нужен без Task<...
    2 авг 18, 11:39    [21623943]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Алексей К
    Member

    Откуда: Новосибирск
    Сообщений: 13633
    hVostt
    Следующий вопрос, может кто решал.

    Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)
    Да никак. Но можно локально убить контекст синхронизации.
    Task.Run(async () =>
    {
        ...
    });
    
    2 авг 18, 11:39    [21623945]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    Petro123
    hVostt
    пропущено...


    Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)
    нет.
    У меня проект, где я в цикле делаю await и результат мне нужен без Task<...
    причем тут результат и void???
    Так или иначе ты можешь запустить метод с таском без ожидания результата, для этого тебе void необязателен.
    Как правильно говорит Хвост, void оставлен только для сохранения сигнатуры для событий
    2 авг 18, 11:43    [21623970]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Алексей К
    Да никак. Но можно локально убить контекст синхронизации.
    Task.Run(async () =>
    {
        ...
    });
    


    Ну это понятно.

    В общем, тут очевидно, что сделали слегка по-дебильному.
    2 авг 18, 11:50    [21624012]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Алексей К
    Member

    Откуда: Новосибирск
    Сообщений: 13633
    hVostt
    В общем, тут очевидно, что сделали слегка по-дебильному.
    Слегка - не то слово!
    2 авг 18, 11:54    [21624041]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Shocker.Pro,
    Ты про то чтобы убрать слово void тут?
    private async void MyRun()
    Ну, это и коню понятно что не надо трогать.
    Чтобы убрать await я тоже против.
    2 авг 18, 11:56    [21624058]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Алексей К
    Member

    Откуда: Новосибирск
    Сообщений: 13633
    hVostt, Ещё камень в авторов ConfigureAwait.
    2 авг 18, 12:01    [21624081]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Алексей К
    hVostt, Ещё камень в авторов ConfigureAwait.


    Согласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false).

    Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации
    2 авг 18, 12:03    [21624095]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Алексей К
    Member

    Откуда: Новосибирск
    Сообщений: 13633
    hVostt
    Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации
    Ну да. HttpContext.Current там нет, а значит и контекст синхронизации там ни к чему.
    2 авг 18, 12:06    [21624111]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Библиотеки все таки не часто пишем.
    А core пока ещё не ГУИ.
    Так что пока не наезжайте на сабж) сильно.
    ))
    2 авг 18, 12:09    [21624128]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Согласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false).

    Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации
    Но временнЫе затраты на переключение контекста ведь никто не отменял...
    2 авг 18, 12:13    [21624151]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    hVostt
    Согласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false).

    Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации
    Но временнЫе затраты на переключение контекста ведь никто не отменял...


    Никто не отменял, поэтому ConfigureAwait(false) приходится втыкать.

    Ещё есть такая штукенция https://github.com/Fody/ConfigureAwait

    Но такие вещи нужно применять с осторожностью.
    2 авг 18, 12:19    [21624197]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ЕвгенийВ
    Member

    Откуда: Москва
    Сообщений: 4865
    Shocker.Pro
    hVostt
    Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)
    замена в исходниках по регулярке )))

    У нас есть Roslyn
    3 авг 18, 14:20    [21628430]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 31276
    Алексей К
    hVostt, Ещё камень в авторов ConfigureAwait.

    Это далеко не все тараканы

    https://www.infoworld.com/article/2960463/application-development/my-two-cents-on-synchronizationcontext-async-and-await.html
    7 авг 18, 11:40    [21632657]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 31276
    Не та ссылка - https://blogs.msdn.microsoft.com/pfxteam/2012/06/15/executioncontext-vs-synchronizationcontext/
    7 авг 18, 11:44    [21632668]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Изопропил,

    Есть такой онекдот. Доктор, почему когда я сильно заворачиваю руку за спину, сгибаюсь и прыгаю на одной ноге, через какое-то время мне становится больно? Не делайте так.

    И вот, пример, который я ждал с самого начала статьи:

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Text = await Task.Run(async delegate
        {
            string data = await DownloadAsync();
            return Compute(data);
        });
    }
    


    Дядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда.

    И так многие делают.

    Вот два решения проблемы:

    1. заставим наш говнокод работать

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Text = await Task.Run(async delegate
        {
            string data = await DownloadAsync().ConfigureAwait(false);
            return Compute(data);
        });
    }
    


    2. включим мозг и напишем по-людски

    private void button1_Click(object sender, EventArgs e)
    {
        string data = await DownloadAsync();
    
        // если вычислительная операция действительно сложная и долговременная, 
        // запустим в отдельном потоке
        button1.Text = await Task.Run(() => Compute(data));
    
        // но зачастую, даже сортировка массивов из тысяч и десятков тысяч элементов работает быстрее
        // чем пользователь успевает моргнуть глазом, для этого не нужно задействовать отдельный поток
    
        // а вот все IO операции должны быть асинк
    }
    


    Глобально решают задачу, отказываюсь от контекста синхронизации совсем. Остаётся execution flow, и с блокировками нужно по-аккуратнее.
    7 авг 18, 14:09    [21632906]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Ещё в примере есть небольшой косячок, надо так :)

    private async Task button1_Click(object sender, EventArgs e)
    
    7 авг 18, 14:12    [21632910]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    private async Task button1_Click(object sender, EventArgs e)
    
    почему Task - это ж эвентхендлер?
    7 авг 18, 14:35    [21632959]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Дядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда.
    Придется показать себя неучем. Почему Compute будет выполняться в UI потоке (без ConfigureAwait(false)), если мы до этого уже эвеитим задачу, в которой должен быть выполнен делегат, то есть он уже как бы начал выполняться не в потоке UI, и возврат из DownloadAsync должен быть не в поток UI, а в поток, в котором выполняется задача из пула. Или я где-то недопонял с возвратом. ((
    7 авг 18, 14:42    [21632967]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt
    Дядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда.

    Наверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?
    7 авг 18, 14:43    [21632969]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    Shocker.Pro,

    опередили)))
    7 авг 18, 14:44    [21632971]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    почему Task - это ж эвентхендлер?


    да, void, но всё равно async ))
    давненько за десктоп не брался
    7 авг 18, 15:29    [21633048]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    button1.Text = await Task.Run(() => Compute(data));
    

    Можно так:
    Compute(){
    .......
    Action a = () => метод в гуи
    }
    7 авг 18, 15:30    [21633050]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    Придется показать себя неучем. Почему Compute будет выполняться в UI потоке (без ConfigureAwait(false)), если мы до этого уже эвеитим задачу, в которой должен быть выполнен делегат, то есть он уже как бы начал выполняться не в потоке UI, и возврат из DownloadAsync должен быть не в поток UI, а в поток, в котором выполняется задача из пула. Или я где-то недопонял с возвратом. ((


    там же await, который не блокирует поток. ContinueAwait(false) позволяет выполнить оставшуюся часть метода любым из свободных потоков, даже тем, который был использован для запуска задачи.

    главное понимать, что Task это не поток.
    7 авг 18, 15:40    [21633062]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Наверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?


    нет, никакого ожидания не будет, точнее будет то, что называется асинхронным ожиданием, но это по сути метафора к тому, что происходит на самом деле
    7 авг 18, 15:43    [21633065]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    там же await, который не блокирует поток. ContinueAwait(false) позволяет выполнить оставшуюся часть метода любым из свободных потоков, даже тем, который был использован для запуска задачи.

    главное понимать, что Task это не поток.

    Не, не врубаюсь.
    Есть UI-поток, он запустил делегат в другом потоке (A) и ждет его завершения.
    Делегат выполняется в потоке А и запускает DownloadAsync в потоке В
    При отсутствии ConfigureAwait(false) после завершения DownloadAsync выполнение должно вернуться в поток В и в нем выполниться Compute
    Поток B - это не поток UI

    Где я ошибаюсь?
    7 авг 18, 16:04    [21633091]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt
    нет, никакого ожидания не будет, точнее будет то, что называется асинхронным ожиданием, но это по сути метафора к тому, что происходит на самом деле

    это да, пусть будет "метафора", но лучше метафора об ожидании, чем об выполнении в UI-потоке
    hVostt
    выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке

    о каком выполнении в UI-потоке идет речь?
    7 авг 18, 16:18    [21633112]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ЕвгенийВ
    Member

    Откуда: Москва
    Сообщений: 4865
    LR
    Наверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?

    Наверное правильнее сказать, что выполнение UI потока будет продолжено в той точке, в которой завершится выполнение задачи.
    Во время выполнения той задачи UI поток свободно может выполнять другие задачи, те же обслуживания выполнения других событий.
    7 авг 18, 16:39    [21633140]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    ЕвгенийВ
    LR
    Наверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?

    Наверное правильнее сказать, что выполнение UI потока будет продолжено в той точке, в которой завершится выполнение задачи.
    Во время выполнения той задачи UI поток свободно может выполнять другие задачи, те же обслуживания выполнения других событий.

    Пожалуй, что и так... Но длинновато, проще сказать, что UI поток будет "поджидать" в той точке...)))
    private async void button1_Click(object sender, EventArgs e)
    {
        button1.Text = await Task.Run(async delegate
        {
            string data = await DownloadAsync().ConfigureAwait(false);
            return Compute(data);
        });
        button1.Text = "Подкараулили!";
    }
    
    7 авг 18, 16:49    [21633154]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Блин)))
    await оператор ожидания.
    Назовите его GoTo, каллбэк и т.д. и т.п.
    Слова поток можно не употреблять.
    Кому как нравится.
    7 авг 18, 17:42    [21633219]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ЕвгенийВ
    Member

    Откуда: Москва
    Сообщений: 4865
    Petro123
    Блин)))
    await оператор ожидания.
    Назовите его GoTo, каллбэк и т.д. и т.п.
    Слова поток можно не употреблять.
    Кому как нравится.

    await - не оператор ожидания!
    7 авг 18, 18:32    [21633325]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    Есть UI-поток, он запустил делегат в другом потоке (A) и ждет его завершения.


    Он запустил задачу в новом потоке и поставил точку ожидания, очень грубо говоря, подписался на продолжение выполнения синхронного кода в любом месте после await, не важно где внутри задачи тоже, если await вызов не сконфигурирован таким образом, чтобы обработать код продолжения мог любой свободный поток.

    Никто ничего не ждёт, иными словами.

    LR правильное слово нашёл для этого: «поджидание» :)

    Shocker.Pro
    Делегат выполняется в потоке А и запускает DownloadAsync в потоке В


    DownloadAsync не выполняется ни в каком потоке. Это IO операция. Условно говоря, есть отдельные IO потоки (но это не потоки конечно же), которые сигнализируют о завершении своего выполнения.

    Shocker.Pro
    При отсутствии ConfigureAwait(false) после завершения DownloadAsync выполнение должно вернуться в поток В и в нем выполниться Compute


    В этом месте уже нет потока B. Если ConfigureAwait(false) отсутствует, то завершение будет обрабатывать основной поток, который владеет контекстом синхронизации.

    https://habr.com/post/107583/ здесь подробней.


    Shocker.Pro
    Поток B - это не поток UI
    Где я ошибаюсь?


    Ты ошибаешься (всё ещё) в том, что считаешь задачу Task потоком. Это не так. Поток дошёл до первого await и пошёл гулять. Он как разнорабочий, залил цементный раствор и пошёл курить, или ещё что-то делать. Мимо проходил другой или тот же самый рабочий, увидел, что цемент застыл и продолжил начатую работу здесь. А главный поток это Прораб, который по умолчанию поручает, чтобы его звали каждый раз, когда длительная операция закончится (застывание цемента, например). Без него ничего не может продолжится, если не сконфигурировано иначе.
    7 авг 18, 18:52    [21633355]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    о каком выполнении в UI-потоке идет речь?


    О синхронном коде.
    7 авг 18, 18:53    [21633357]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    ЕвгенийВ
    Petro123
    Блин)))
    await оператор ожидания.
    Назовите его GoTo, каллбэк и т.д. и т.п.
    Слова поток можно не употреблять.
    Кому как нравится.

    await - не оператор ожидания!

    Смешно.
    Оператор await используется для ожидания
    Так подходит?))
    7 авг 18, 19:17    [21633388]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 31276
    Поможет только внимательный разбор исходников
    7 авг 18, 19:25    [21633398]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt,

    в той статье автор пространно размышлял примерно так: "В таск перетекает ExecutionContext, вместе с ним, как часть, SynchronizationContext.Current, и если перетекает действительно "в статусе текущего" - тогда это плохо, ибо, например, вот в таком коде это приведет к (нежелательному) выполнению Compute(data) на UI-потоке". Заканчиваются эти размышления обзором internal-методов в mscorlib и заключительной фразой: "In short, SynchronizationContext.Current does not “flow” across await points."
    7 авг 18, 19:25    [21633399]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    Petro123,

    Тревожное ожидание (лучше бы - тревожная работа (работаешь(отдыхаешь) и ждешь звоночка))
    7 авг 18, 19:26    [21633400]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    Изопропил
    Поможет только внимательный разбор исходников

    Поможет внимательное прочтение асинхронного ввода/вывода в Windows NT
    7 авг 18, 19:27    [21633402]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR,

    Это зависит от конфигурации await вызова, и работает для кода продолжения, но контекст синхронизации не назначается потоку, как это можно сделать старым способом через Post или через шедулер.
    7 авг 18, 19:47    [21633426]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 31276
    ViPRos
    Изопропил
    Поможет только внимательный разбор исходников

    Поможет внимательное прочтение асинхронного ввода/вывода в Windows NT

    этого недостаточно.
    он сильно проще и логичнее в NT
    7 авг 18, 20:16    [21633454]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 31276
    LR
    hVostt,

    в той статье автор пространно размышлял примерно так: "В таск перетекает ExecutionContext, вместе с ним, как часть, SynchronizationContext.Current, и если перетекает действительно "в статусе текущего" - тогда это плохо, ибо, например, вот в таком коде это приведет к (нежелательному) выполнению Compute(data) на UI-потоке". Заканчиваются эти размышления обзором internal-методов в mscorlib и заключительной фразой: "In short, SynchronizationContext.Current does not “flow” across await points."

    вроде как всё понятно
    автор
    The internal one (internal to mscorlib) is the one used by most asynchronous functionality exposed from mscorlib, and it optionally allows the caller to suppress the capturing of SynchronizationContext as part of ExecutionContext; corresponding to that, there’s also an internal overload of the Run method that supports ignoring a SynchronizationContext that’s stored in the ExecutionContext, in effect pretending one wasn’t captured (this is, again, the overload used by most functionality in mscorlib). What this means is that pretty much any asynchronous operation whose core implementation resides in mscorlib won’t flow SynchronizationContext as part of ExecutionContext, but any asynchronous operation whose core implementation resides anywhere else will flow SynchronizationContext as part of ExecutionContext.
    7 авг 18, 20:24    [21633461]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    Изопропил
    вроде как всё понятно

    да, и касательно async-методов, следующее же предложение является решающим в цепочке его умозаключений
    автор
    I previously mentioned that the “builders” for async methods were the types responsible for flowing ExecutionContext in async methods, and these builders do live in mscorlib, and they do use the internal overloads… as such, SynchronizationContext is not flowed as part of ExecutionContext across awaits
    7 авг 18, 20:51    [21633475]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Shocker.Pro
    При отсутствии ConfigureAwait(false) после завершения DownloadAsync выполнение должно вернуться в поток В и в нем выполниться Compute


    В этом месте уже нет потока B. Если ConfigureAwait(false) отсутствует, то завершение будет обрабатывать основной поток, который владеет контекстом синхронизации.

    https://habr.com/post/107583/ здесь подробней.
    Блин, я сам опечатался, когда писал. Имелось ввиду "в поток А".
    Ок, не будем использовать термин "ожидание", это как-бы условность - да, будем говорит о продолжении.
    Итак, UI-поток запустил делегат на потоке из пула (А). Когда делегат закончит выполнение, тогда будет продолжение в UI-потоке (а именно, выполнится присвоение button1.Text =)

    Далее делегат запускает DownloadAsync(). Сам делегат выполняется в потоке А. Так как при вызове DownloadAsync() нет ConfigureAwait(false), то продолжение в делегате после await-а (а именно метод Compute()) должен выполняться в потоке А. Где я не прав?

    Статья ясности не внесла - там нет каскадного await-а

    Сообщение было отредактировано: 8 авг 18, 07:39
    8 авг 18, 05:09    [21633696]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >Petro123, вчера, 19:17 [21633388]
    >...Оператор await используется для ожидания.
    <Может быть так:
    В коде вызывающего метода оператор await используется для ожидания завершения кода вызванного метода. Коды других методов, обработчиков сообщений, могут работать асинхронно.
    8 авг 18, 08:43    [21633777]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    Итак, UI-поток запустил делегат на потоке из пула (А). Когда делегат закончит выполнение, тогда будет продолжение в UI-потоке (а именно, выполнится присвоение button1.Text =)


    Ты думаешь, что UI-поток получит управление только в точке вызова Task, т.е. на момент присвоения button1.Text, но это не так. UI-поток подключится после любого await, не важно какой каскад функций был вызван внутри, если не сконфигурировано иначе.

    Обычно принято в библиотеках везде втыкать ConfigureAwait, чтобы разработчик не получал фризы и дедлоки.


    Shocker.Pro
    Так как при вызове DownloadAsync() нет ConfigureAwait(false), то продолжение в делегате после await-а (а именно метод Compute()) должен выполняться в потоке А. Где я не прав?


    Ты всё ещё думаешь, что после выполнения асинхронного метода есть какой-то поток А, который запустил DownloadAsync и теперь сидит ждёт, когда он выполнится :) После запуска асинхронного метода, поток освободился, и где будет выполнятся продолжение метода теперь зависит от ConfigureAwait.
    8 авг 18, 08:49    [21633778]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt
    Ты думаешь, что UI-поток получит управление только в точке вызова Task, т.е. на момент присвоения button1.Text, но это не так. UI-поток подключится после любого await, не важно какой каскад функций был вызван внутри, если не сконфигурировано иначе.

    Откуда такое заблуждение? Вся та статья как раз и посвящена доказательству того что это не так (что контекст синхронизации не переходит через await, а значит, если вызов async-метода производится не из UI-потока, то и продолжение не будет выполнятся в UI-потоке, что бы там в ConfigureAwait не задавалось).
    Вот как в этой точке UI-поток может получить управление?
    private async void button1_Click(object sender, EventArgs e)
    {
        button1.Text = await Task.Run(async delegate
        {
            string data = await DownloadAsync();
            //button1.Text = "как в этой точке UI-поток может получить управление?";
            return Compute(data);
        });
    }
    

    Разве что так, но ведь разговор идет вовсе не об этом
    var sc = SynchronizationContext.Current;
    ...
    sc.Post(new SendOrPostCallback((o) =>
    {
         button1.Text = "только через SynchronizationContext.Post и подобное";
    }), null);
    
    8 авг 18, 09:56    [21633856]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    что после выполнения асинхронного метода есть какой-то поток А
    То есть именно этот поток может уже и не существовать, когда возникает необходимость продолжения, ок, это дошло.

    Я всегда пишу ConfigureAwait(false) кроме начальных вызовов из UI-потока, даже если и не в библиотеках.

    Получается, что если ConfigureAwait(false) где-то забыл, то мы получим продолжение в контексте синхронизации независимо от глубины вложенности await-ов. При этом если забыли ConfigureAwait(false) на N-ом уровне вложенности, продолжение N-ого уровня выполнится в UI-потоке, и все по цепочке N-1, N-2... обратно к началу вызовов начнет выполняться в UI-потоке, потому что ConfigureAwait(false) разрешит не менять поток при продолжении. Теперь я правильно понял?
    8 авг 18, 09:57    [21633859]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    Shocker.Pro,

    ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключение
    8 авг 18, 10:32    [21633956]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    kealon(Ruslan)
    ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключение
    ConfigureAwait(false) разрешает выполнять продолжение в том же потоке, но меня пока интересует обратная ситуация...
    8 авг 18, 10:34    [21633962]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    ВМоисеев
    >Petro123, вчера, 19:17 [21633388]
    >...Оператор await используется для ожидания.
    <Может быть так:
    В коде вызывающего метода оператор await используется для ожидания завершения кода вызванного метода. Коды других методов, обработчиков сообщений, могут работать асинхронно.

    Это противоречит? Уточняет? Добавляет эмоции?
    Зачем ты это написал?
    8 авг 18, 10:57    [21634009]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    LR
    если вызов async-метода производится не из UI-потока,
    это когда нибудь требуется? Или это чисто абстрактно?
    8 авг 18, 11:02    [21634020]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 5425
    Shocker.Pro
    kealon(Ruslan)
    ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключение
    ConfigureAwait(false) разрешает выполнять продолжение в том же потоке, но меня пока интересует обратная ситуация...
    именно что в любом
    true to attempt to marshal the continuation back to the original context captured; otherwise, false.
    8 авг 18, 11:12    [21634035]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Откуда такое заблуждение? Вся та статья как раз и посвящена доказательству того что это не так (что контекст синхронизации не переходит через await, а значит, если вызов async-метода производится не из UI-потока, то и продолжение не будет выполнятся в UI-потоке, что бы там в ConfigureAwait не задавалось).


    Зачем ему переходить? И почему заблуждение? Сейчас покажу.

    private async void button1_Click(object sender, EventArgs e)
    {
        button1.Text = await Task.Run(async delegate
        {
            string data = await DownloadAsync();
            
            // вот это будет работать, в этом смысл использования await в UI )))
            button1.Text = "как в этой точке UI-поток может получить управление?";
            
            return Compute(data);
        });
    }
    


    LR
    Вот как в этой точке UI-поток может получить управление?


    Давайте от обратного. Если он его там не получит, то невозможно в продолжении взаимодействовать с UI. Если UI поток не может выполнять код после await где-то внутри цепочки вызовов функций, значит невозможно будет написать сколько-нибудь серьёзный код с использованием await.
    8 авг 18, 11:40    [21634062]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >Petro123, сегодня, 10:57 [21634009]
    >...Зачем ты это написал?
    <Я так думаю.
    UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.
    8 авг 18, 11:43    [21634065]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >Petro123, сегодня, 10:57 [21634009]
    >...Зачем ты это написал?
    <Я так думаю.
    UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.
    8 авг 18, 11:45    [21634071]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    Я всегда пишу ConfigureAwait(false) кроме начальных вызовов из UI-потока, даже если и не в библиотеках.


    Это нужно делать только в библиотеках, которые однозначно не взаимодействуют с UI и которым не требуется контекст синхронизации.

    Shocker.Pro
    Получается, что если ConfigureAwait(false) где-то забыл, то мы получим продолжение в контексте синхронизации независимо от глубины вложенности await-ов. При этом если забыли ConfigureAwait(false) на N-ом уровне вложенности, продолжение N-ого уровня выполнится в UI-потоке, и все по цепочке N-1, N-2... обратно к началу вызовов начнет выполняться в UI-потоке, потому что ConfigureAwait(false) разрешит не менять поток при продолжении. Теперь я правильно понял?


    Да, глубина вложенности не имеет значения, так как компилятор строит конечный автомат.
    Ну примерно, да :)

    Вот хорошая заметка.

    http://andrey.moveax.ru/post/csharp-async-wait-deadlocks
    8 авг 18, 11:46    [21634073]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Ещё есть такой трюк

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        await AsyncHelper.RedirectToThreadPool();
        // всё, мы больше не в UI-контексте, гарантировано
    
        HttpClient httpClient = new HttpClient();
        string content = await httpClient.GetStringAsync("http://www.microsoft.com"); 
        // ...
    }
    


    (источник)
    8 авг 18, 11:48    [21634080]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt
    Зачем ему переходить? И почему заблуждение? Сейчас покажу.

    private async void button1_Click(object sender, EventArgs e)
    {
        button1.Text = await Task.Run(async delegate
        {
            string data = await DownloadAsync();
            
            // вот это будет работать, в этом смысл использования await в UI )))
            button1.Text = "как в этой точке UI-поток может получить управление?";
            
            return Compute(data);
        });
    }
    

    Это работать не будет. Будет System.InvalidOperationException: 'Cross-thread operation not valid: Control 'button1' accessed from a thread other than the thread it was created on.'

    hVostt
    Давайте от обратного. Если он его там не получит, то невозможно в продолжении взаимодействовать с UI. Если UI поток не может выполнять код после await где-то внутри цепочки вызовов функций, значит невозможно будет написать сколько-нибудь серьёзный код с использованием await.

    Весьма странный довод.
    8 авг 18, 12:04    [21634106]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Да, глубина вложенности не имеет значения, так как компилятор строит конечный автомат.
    Ну примерно, да :)
    То есть, если я напишу грубо говоря
    await Task.Delay(1);
    Text1.Text="UI";
    
    это будет работать, из какого бы метода это не было вызвано?
    hVostt
    Это нужно делать только в библиотеках, которые однозначно не взаимодействуют с UI и которым не требуется контекст синхронизации.
    Ну если это код хелпера, например, внутри проекта, который не взаимодействует с UI, зачем мне его выполнять в UI?
    8 авг 18, 12:05    [21634107]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ЕвгенийВ
    Member

    Откуда: Москва
    Сообщений: 4865
    hVostt
    Ещё есть такой трюк

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        await AsyncHelper.RedirectToThreadPool();
        // всё, мы больше не в UI-контексте, гарантировано
    
        HttpClient httpClient = new HttpClient();
        string content = await httpClient.GetStringAsync("http://www.microsoft.com"); 
        // ...
    }
    


    (источник)

    Чета я не допираю.
    INotifyCompletion
    Нафига у ThreadPoolRedirector другие члены окромя OnCompleted?
    8 авг 18, 12:05    [21634108]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    ВМоисеев
    >Petro123, сегодня, 10:57 [21634009]
    >...Зачем ты это написал?
    <Я так думаю.
    UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.

    Не нужно додумывать за MS.
    У МS термин ожидание это не form.ShowModal; из дельфи прошлого века.
    Где код ГУИ встал на этой строчке.
    Ожидание потока имеется ввиду.
    8 авг 18, 12:14    [21634132]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    Ну если это код хелпера, например, внутри проекта, который не взаимодействует с UI, зачем мне его выполнять в UI?


    Ну может это хелпер, который может обновлять ProgressBar. Или ещё что-то делать. Серьёзные приложения имеют сложность, которая не укладывается код обработчиков событий. Код слишком большой, чтобы размещать его там, если интенсивно используются асинхронные операции. Ну и MVP/MVVM никто не отменял :)
    8 авг 18, 15:20    [21634546]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    То есть, если я напишу грубо говоря
    await Task.Delay(1);
    Text1.Text="UI";
    

    это будет работать, из какого бы метода это не было вызвано?


    Если в цепочке вызовов везде будет await, да.
    8 авг 18, 15:21    [21634548]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Если в цепочке вызовов везде будет await, да.
    А какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?
    8 авг 18, 15:22    [21634551]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    hVostt
    Если в цепочке вызовов везде будет await, да.
    А какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?


    В общем, LR действительно прав в том, что при вызове Task.Run текущий контекст синхронизации никак не передаётся в асинхронные вызовы внутри полученного потока для выполнения задачи. Он остаётся на точке await Task.Run.

    Прошу прощения, что ввёл в заблуждение. Правда, что контекст сохраняется в цепочке вызовов на любом уровне, но не передаётся внутрь запущенных потоков.

    Т.е. внутри Task.Run, ConfigureWait не влияет на выполнение.

    В таком варианте, грубо:

    await Some1(...)
       ...
       await Some2(...)
          ...
          await Some3(...)
             ...
             await Some4(...)
             ...
          ...
       ...
    


    Это работает.

    А теперь немного треша,

                label1.Text = await await Task.Factory.StartNew(
                    async () =>
                    {
                        label1.Text = "button1_Click: thinking";
                        await Task.Delay(TimeSpan.FromSeconds(3));
                        return "button1_Click: done!!";
                    },
                    CancellationToken.None,
                    TaskCreationOptions.None,
                    TaskScheduler.FromCurrentSynchronizationContext());
    


    Два await это не ошибка :)
    8 авг 18, 16:06    [21634618]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ЕвгенийВ
    Чета я не допираю.
    INotifyCompletion
    Нафига у ThreadPoolRedirector другие члены окромя OnCompleted?


    Для await нужен объект с методом GetAwaiter
    8 авг 18, 16:15    [21634643]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    А какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?


    По поводу вопроса, ещё раз. Если ты вызовешь Wait или Result на таске вместо await, а внутри будет await без ConfigureAwait(false) будет гарантированный дедлок.
    8 авг 18, 16:16    [21634644]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >Petro123, сегодня, 12:14 [url=] [21634132]
    [/url]
    >...Где код ГУИ встал на этой строчке…
    <Стоит как миленький, и обработчики работают, и прогресс бар показывает:
    object[][] psp = new object[3][];
    psp[0] = new object[2] { "x_nazvanie", xstr };
    psp[1] = new object[2] { "x_dt_begin", (DateTime)dpr_Начало.SelectedDate };
    psp[2] = new object[2] { "x_dt_end", (DateTime)dpr_Конец.SelectedDate };
    при.tmrStart(); await Task.Run(() => wsp.Entity_SP("NCUYAO_GIS.VD_Inspek_Sel", wsp.sp_Sel, psp, RowToEntity)); при.tmrStop();
    8 авг 18, 16:49    [21634698]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ЕвгенийВ
    Member

    Откуда: Москва
    Сообщений: 4865
    hVostt
    ЕвгенийВ
    Чета я не допираю.
    INotifyCompletion
    Нафига у ThreadPoolRedirector другие члены окромя OnCompleted?


    Для await нужен объект с методом GetAwaiter

    Т. е. для решение проблемы, о которой можно сказать, хз, есть она или нет, скорее всего нет, если механизмом async/await пользоваться только там, где он предназначен используется следующее решение -

    "Используйте механизм, о котором в документации явно сказано, что это инфраструктура и нефик юзать в прикладном коде (как минимум могут изменить механизм), при чем эта инфраструктура юзает утиную типизацию. А само "решение" гарантированно подменяет пул потоков созданный специально для тасков, на пул ThreadPool существующий со времен царя Гороха."
    8 авг 18, 17:25    [21634772]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ViPRos
    Member

    Откуда:
    Сообщений: 9658
    hVostt,

    В сложных прогах лучше не пользоваться асинк авейт думаю - фиг концов найдешь потом
    8 авг 18, 17:25    [21634774]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ЕвгенийВ
    Member

    Откуда: Москва
    Сообщений: 4865
    ВМоисеев,
    Открой наконец для себя возможности форматирования кода!
    8 авг 18, 17:27    [21634776]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ЕвгенийВ
    Т. е. для решение проблемы, о которой можно сказать, хз, есть она или нет, скорее всего нет, если механизмом async/await пользоваться только там, где он предназначен используется следующее решение -

    "Используйте механизм, о котором в документации явно сказано, что это инфраструктура и нефик юзать в прикладном коде (как минимум могут изменить механизм), при чем эта инфраструктура юзает утиную типизацию. А само "решение" гарантированно подменяет пул потоков созданный специально для тасков, на пул ThreadPool существующий со времен царя Гороха."


    Ну в целом, знать как это устроено внутри полезно, но для использования нужно абстрагироваться. Нужно было бы. Если бы C# изначально проектировался с async/await, возможно получился бы простой и лёгкий синтаксис, как в Go.
    8 авг 18, 18:20    [21634855]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ViPRos
    hVostt,

    В сложных прогах лучше не пользоваться асинк авейт думаю - фиг концов найдешь потом


    Мы проект написали полностью async-first.

    Из плюсов:

    1. Асинхронный вызов можно встроить в любой точке на любой глубине кода.
    2. Высокопроизводительное решение для обработки огромного числа запросов пользователей.

    Из минусов:

    1. Дофига await.
    2. Дофига ConfigureAwait(false) -- помогают расширения решарпера и рослин, можно автоматизировать процесс.
    3. В некоторых случаях, функциональный подход (аля промисы) -- лучше, для этого приходится оборачивать async/await (дожили).
    4. Все минусы меркнут перед сложностью отладки. Нет, IDE не встанет заботливо на точку по месту ошибки. Те, кто привыкли так работать страдают и воют как кони. Но если изначально отказываться от разработки через отладку, проблем нет.
    8 авг 18, 18:25    [21634863]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    Мы проект написали полностью async-first.

    Из плюсов:

    1. Асинхронный вызов можно встроить в любой точке на любой глубине кода.

    Чет ты перегнул.
    Как вставить по стеку в глубине, если async не поддерживает стек?
    8 авг 18, 18:38    [21634878]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Petro123
    Чет ты перегнул.
    Как вставить по стеку в глубине, если async не поддерживает стек?


    ну заведомо синхронные методы -- синхронные, без фанатизма, их намного больше.
    но все сервисы, службы, шины, менеджеры, и прочее -- асинхронные.
    8 авг 18, 18:39    [21634880]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt,

    Ну, понятно. async First это просто "делайте чаще чтобы гуи не морозило))
    8 авг 18, 18:46    [21634886]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ЕвгенийВ
    Member

    Откуда: Москва
    Сообщений: 4865
    hVostt

    Ну в целом, знать как это устроено внутри полезно, но для использования нужно абстрагироваться. Нужно было бы. Если бы C# изначально проектировался с async/await, возможно получился бы простой и лёгкий синтаксис, как в Go.

    А что в GO такого легкого и простого?
    Ужасные горутины и каналы?
    Просто мерзкая обработка ошибок?
    И никакого ГУЯ!
    8 авг 18, 19:06    [21634894]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ЕвгенийВ
    А что в GO такого легкого и простого?
    Ужасные горутины и каналы?
    Просто мерзкая обработка ошибок?
    И никакого ГУЯ!


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

    кстати, в .NET тоже будут каналы, скоро.
    пока в глубокой бете.
    8 авг 18, 19:12    [21634899]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    будут каналы, скоро.
    вот я не понимаю почему сабж со стеком не работает?
    Bool Metod1{
       if (Metod2(contextDb)) {
           CreateMap();
           CopyMap();
           return true;
       }
    

    Вот как вставить асинхронный метод в метод2?
    8 авг 18, 19:23    [21634906]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Petro123
    вот я не понимаю почему сабж со стеком не работает?


    что ты имеешь в виду?


    Petro123
    Вот как вставить асинхронный метод в метод2?


    сделать Metod2 асинхронным _)
    8 авг 18, 19:34    [21634914]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ЕвгенийВ
    Member

    Откуда: Москва
    Сообщений: 4865
    hVostt

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

    Ужасные - это касалось горутин. Обычный запуск задачи в отдельном потоке.

    hVostt
    кстати, в .NET тоже будут каналы, скоро.
    пока в глубокой бете.

    Про каналы ничего не имею против, особенно когда они допускают межпроцессорное и межкомпьютерное взаимодействие.
    В .NET они уже были 9 лет назад.
    Axum
    Введение в язык программирования Axum
    8 авг 18, 19:35    [21634915]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    сделать Metod2 асинхронным _)
    как сделать без замены возврата bool?
    Этод метод вызывается в куче мест.
    8 авг 18, 19:54    [21634923]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    что ты имеешь в виду?
    CreateMap() будет вызвана до окончания потока внутри метода2.
    8 авг 18, 19:57    [21634924]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >Petro123, сегодня, 18:38 [21634878]
    >...Нет, IDE не встанет заботливо на точку по месту ошибки. Те, кто привыкли так работать страдают и воют…
    <Что-то не понимаю:

    К сообщению приложен файл. Размер - 31Kb
    8 авг 18, 20:04    [21634931]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ЕвгенийВ
    Ужасные - это касалось горутин. Обычный запуск задачи в отдельном потоке.


    Почему в отдельном потоке? Это уж как повезёт :)


    ЕвгенийВ
    Про каналы ничего не имею против, особенно когда они допускают межпроцессорное и межкомпьютерное взаимодействие.
    В .NET они уже были 9 лет назад.


    https://www.nuget.org/packages/System.Threading.Channels :)
    8 авг 18, 20:29    [21634944]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Petro123
    как сделать без замены возврата bool?
    Этод метод вызывается в куче мест.


    никак, либо две версии метода
    8 авг 18, 20:30    [21634945]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ВМоисеев
    <Что-то не понимаю:


    Код на скрне полностью синхронный.
    8 авг 18, 20:31    [21634947]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    ВМоисеев
    Member

    Откуда: Редкино
    Сообщений: 2012
    >hVostt, сегодня, 20:31 [21634947]

    >Код на скрне полностью синхронный.
    <А так:

    К сообщению приложен файл. Размер - 18Kb
    8 авг 18, 21:03    [21634986]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    ВМоисеев,

    И чего? Вы точку останова поставили.
    Речь идёт о сваливании с исключением и остановкой дебагера на этом месте.
    8 авг 18, 21:12    [21634996]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    По поводу вопроса, ещё раз. Если ты вызовешь Wait или Result на таске вместо await, а внутри будет await без ConfigureAwait(false) будет гарантированный дедлок.
    По поводу вложенности еще раз. Если await без ConfigureAwait(false) на первом уровне - то дедлок понятен, а если, к примеру, первый-второй уровень вложенности идет с ConfigureAwait(false), а на третьем забыли. Будет ли дедлок и если да, то почему?
    9 авг 18, 05:01    [21635258]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    По поводу вложенности еще раз. Если await без ConfigureAwait(false) на первом уровне - то дедлок понятен, а если, к примеру, первый-второй уровень вложенности идет с ConfigureAwait(false), а на третьем забыли. Будет ли дедлок и если да, то почему?


    Вот тут всё ок.

            private async void button1_Click(object sender, EventArgs e)
            {
                label1.Text = await TestAsync();            
            }
    
            private async Task<string> TestAsync()
            {
                label1.Text = "button1_Click: TestAsync running";
                await TestTestAsync().ConfigureAwait(false);
                // продолжение будет выполнено в другом потоке, отличном от UI
                return "button1_Click: TestAsync result";
            }
    
            private async Task TestTestAsync()
            {
                // вызов этого метода с ConfigureAwait() не влияет на выполнение этого метода
                await Task.Delay(TimeSpan.FromSeconds(1));
                // продолжение будет выполнено в UI потоке
                label1.Text = "button1_Click: TestTestAsync running";
            }
    


    А здесь будет ошибка

            private async void button1_Click(object sender, EventArgs e)
            {
                label1.Text = await TestAsync();            
            }
    
            private async Task<string> TestAsync()
            {
                label1.Text = "button1_Click: TestAsync running";
                await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
                // продолжение будет выполнено в другом потоке, отличном от UI
                // и это означает, что вызов TestTestAsync() не получит контекст синхронизации UI            
                await TestTestAsync();            
                return "button1_Click: TestAsync result";
            }
    
            private async Task TestTestAsync()
            {
                await Task.Delay(TimeSpan.FromSeconds(1));
                // здесь будет ошибка, так как контекст синхронизации был потерян
                label1.Text = "button1_Click: TestTestAsync running";
            }
    
    9 авг 18, 10:23    [21635498]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro,

    Необходимо понимать, что ConfigureAwait на сам вызов метода не влияет, только на продолжение.

    Для кода, выполняемого после ConfigureAwait контекст потерян, и там уже не имеет значения, есть ConfigureAwait или нет.
    9 авг 18, 10:25    [21635502]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Необходимо понимать, что ConfigureAwait на сам вызов метода не влияет, только на продолжение.
    это я понимаю. Я не понимаю какой-то другой нюанс в твоем изначальном примере и пытаюсь его нащупать...

    Я, похоже, вот какой момент не до конца осознавал... при вызове асинхронного метода (в том числе каскадно) его (их) операторы будут выполняться в вызвавшем потоке до первого встреченного await-а. Я воспринимал, что операторы сразу начнут выполняться в другом потоке. И, кажется, я это знал, но забыл )) Отсюда все мои предыдущие вопросы можно аннулировать
    Спасибо.
    9 авг 18, 11:16    [21635616]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Сейчас проекты пишутся async-first. Всё хорошо.
    При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?
    9 авг 18, 11:17    [21635619]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    Вот пример, где ConfigureAwait(false) не спасает от дедлока, это только у меня так? (WinForms, VS2017, FW 4.5.2-4.6.2)
            private void button1_Click(object sender, EventArgs e)
            {
                button1.Text = FindAsync("https://www.sql.ru/forum/1300144-9/zachem-nuzhen-await",
                    "Будет ли дедлок").Result;
            }
            private async Task<string> FindAsync(string uri, string s)
            {
                var data = await new WebClient().DownloadStringTaskAsync(uri).ConfigureAwait(false);
                return s + " - " + (data.IndexOf(s) >= 0 ? "найдено!" : "не найдено.");
            }
    

    ConfigureAwait(false) лишь отменяет требование выполнять продолжение в первоначальном контексте, т.е., дает "добро" на любой контекст, в т.ч. не исключая первоначальный. В данном примере, вероятно, async-инфраструктуре "влом" идти и брать свободный поток из пула, и выбирается то, что "под боком" - а это (уже блокированный ожиданием .Result) UI-поток.
    Или все происходит как-то по другому? Может кто-нибудь проверить этот пример у себя?
    9 авг 18, 11:35    [21635677]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Shocker.Pro
    hVostt
    Сейчас проекты пишутся async-first. Всё хорошо.
    При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?
    забить студия не даст.
    9 авг 18, 11:57    [21635733]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    Petro123
    забить студия не даст.
    С чего вдруг не даст? Даже решарпер - и тот не настаивает.
    9 авг 18, 12:05    [21635751]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    Я, похоже, вот какой момент не до конца осознавал... при вызове асинхронного метода (в том числе каскадно) его (их) операторы будут выполняться в вызвавшем потоке до первого встреченного await-а. Я воспринимал, что операторы сразу начнут выполняться в другом потоке. И, кажется, я это знал, но забыл )) Отсюда все мои предыдущие вопросы можно аннулировать


    Да, до первого await, который вернёт незавершённую задачу (важное уточнение), всё будет синхронно.

    Shocker.Pro
    При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?


    Нет, не забили. Все асинхронные методы имеют суффикс Async. Контролируется на этапе сборки.
    9 авг 18, 13:09    [21635911]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    Shocker.Pro
    Petro123
    забить студия не даст.
    С чего вдруг не даст? Даже решарпер - и тот не настаивает.

    хм... Проверил, ты прав. Убрал суффикс и не ругается.
    9 авг 18, 13:10    [21635914]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    Контролируется на этапе сборки.
    тоже помню где то ругалась.
    Счас проверил - f2, переименовать - не ругается)
    9 авг 18, 13:12    [21635920]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    ConfigureAwait(false) лишь отменяет требование выполнять продолжение в первоначальном контексте, т.е., дает "добро" на любой контекст, в т.ч. не исключая первоначальный. В данном примере, вероятно, async-инфраструктуре "влом" идти и брать свободный поток из пула, и выбирается то, что "под боком" - а это (уже блокированный ожиданием .Result) UI-поток.
    Или все происходит как-то по другому? Может кто-нибудь проверить этот пример у себя?


    https://stackoverflow.com/questions/18524609/configureawaitfalse-still-deadlocks

    Меняем на HttpClient и проблема исчезает.
    Вообще, от WebCliet надо уже дааааааавным давно уже было отказаться везде где только можно.
    9 авг 18, 13:17    [21635929]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 21001
    hVostt
    Нет, не забили. Все асинхронные методы имеют суффикс Async.
    И даже методы контроллера?
    9 авг 18, 13:18    [21635930]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Shocker.Pro
    hVostt
    Нет, не забили. Все асинхронные методы имеют суффикс Async.
    И даже методы контроллера?


    Нет, это исключение из правила :)
    9 авг 18, 13:18    [21635933]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt
    https://stackoverflow.com/questions/18524609/configureawaitfalse-still-deadlocks

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

    Ага, понятно, спасибо! Получается, что панацеи от дедлока при синхронном вызове "какого либо" асинхронного метода не существует... Переделывать синхронные методы в асинхронные, чтобы безопасно вызывать "любые" асинхронные, тоже не всегда возможно (out-параметры и т.п.). В общем, асинхронность "кусается"))
    9 авг 18, 13:51    [21636045]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Ага, понятно, спасибо! Получается, что панацеи от дедлока при синхронном вызове "какого либо" асинхронного метода не существует... Переделывать синхронные методы в асинхронные, чтобы безопасно вызывать "любые" асинхронные, тоже не всегда возможно (out-параметры и т.п.). В общем, асинхронность "кусается"))


    Почему? Можно, но делать надо это правильно :)

    Вот небольшой пример с описанием

    http://andrey.moveax.ru/post/csharp-sync-to-async
    9 авг 18, 13:57    [21636077]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    LR
    Member

    Откуда: 8P8C
    Сообщений: 2421
    hVostt
    Почему? Можно, но делать надо это правильно :)

    Вот небольшой пример с описанием

    http://andrey.moveax.ru/post/csharp-sync-to-async

    Пример хороший, но несколько о другом.
    Речь о том, как безопасно вызывать "какой либо" асинхронный метод. Из async-метода это сделать легко - используя await. Из синхронного - сложнее, зависит от... Но, например, как в примере с дедлоком, этот синхронный метод (обработчик нажатия кнопки) легко превратить в асинхронный (дописать async) - и в нем задействовать await. Но такое легкое "превращение" не всегда возможно, в частности, если у метода есть out-параметры.
    9 авг 18, 14:24    [21636143]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    Пример хороший, но несколько о другом.
    Речь о том, как безопасно вызывать "какой либо" асинхронный метод. Из async-метода это сделать легко - используя await. Из синхронного - сложнее, зависит от... Но, например, как в примере с дедлоком, этот синхронный метод (обработчик нажатия кнопки) легко превратить в асинхронный (дописать async) - и в нем задействовать await. Но такое легкое "превращение" не всегда возможно, в частности, если у метода есть out-параметры.


    К сожалению, никак :(
    Поэтому,

    1. избегать возможности дедлока, не делать Wait и не обращаться к Result у Task
    2. если нужно асинхронную задачу запустить синхронно, например, так https://msdn.microsoft.com/en-us/library/dd321435(v=vs.110).aspx
    3. ну и ConfigureAwait в библиотеках, традиционно
    9 авг 18, 15:44    [21636351]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    LR
    если у метода есть out-параметры


    Запаковывать в OperationResult, как уже обсуждалось тут ранее ))
    9 авг 18, 15:45    [21636355]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    LR
    если у метода есть out-параметры


    Запаковывать в OperationResult, как уже обсуждалось тут ранее ))

    Не надо делать синхронный код асинхронным автоматически или волшебством дописав async.
    Если у вас out или у меня стек вызовов до 5го колена, то ничего не выйдет.
    Логику и методы надо будет переписать.
    Не заворачивая out в result, а полностью избавится от них.
    Как в java).
    Асинхронный код и сам программист не равен синхронному)).
    9 авг 18, 16:03    [21636388]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Petro123
    Не надо делать синхронный код асинхронным автоматически или волшебством дописав async.


    Обычно это нужно, когда асинхронные интерфейсы и синхронный код, который надо подсунуть через адаптер.
    9 авг 18, 16:30    [21636432]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    Обычно это нужно, когда асинхронные интерфейсы и синхронный код, который надо подсунуть через адаптер.
    сложно понять постановку в одно предложение.
    Но вероятно что все методы уже готовы для асинхрооности)).
    Out,ref нету. Общения с ГУИ нету. Они без вложенности и слабозависимы от результатов..
    Тогда можно и async first). Это твой термин?
    У меня в десктопе, кстати, не так много мест где нужна асинхронность.
    9 авг 18, 16:50    [21636471]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Petro123,

    Всё, что потенциально работает с данными, асинхронное. Также, запросы API, работа с файлами, тоже асинхронное. В десткопе это тоже имеет смысл, но десктоп не сильно страдает от использования потоков для получения асинхронного поведения. Хотя зависит от объёма функционала и нагрузки.
    10 авг 18, 10:02    [21637271]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt,
    Вот смотри.
    Есть же другие способы в IT добится цели.
    В веб это контейнер или конвейер запросов. На каждый запрос конейнер выделяет новый поток.
    В десктопе есть ОРМ, кэш, СУБД которые делают время отклика 0,1 сек.
    Поэтому асинхронность методом await нужна там где нужна и в строке где поставил программист.
    Согласись, что бездумно пихать асинхронность например на чтение конфига нафиг нужно.
    Профи используют к месту и с умом). На то они и профи.
    10 авг 18, 10:22    [21637296]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt,
    Поэтому я не поддерживаю сабж чтобы убрать оператор) и асинхронность first.
    Imho.
    Удачи!
    10 авг 18, 10:25    [21637301]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    Petro123
    Согласись, что бездумно пихать асинхронность например на чтение конфига нафиг нужно.


    Если программа не может стартануть без конфига, то синхронное чтение абсолютно уместно. В ином случае, асинхронный доступ лучше, так как IO операции не детерменированы по времени.
    10 авг 18, 10:27    [21637304]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    Если программа не может стартануть без конфига, то синхронное чтение абсолютно уместно
    не понял как первое со вторым связано.
    Первое решается тремя способами:
    - конфиг это project - properties - settings
    - руками.....после InitializeComponent() создать если надо default конфиг
    - в коде учитывай что его нет.
    10 авг 18, 12:11    [21637538]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    hVostt
    асинхронный доступ лучше, так как IO операции не детерменированы по времени.

    Ты по проще для народа выражайся).
    Я выше писал, то профи держит под контролем IO операции.
    10 авг 18, 12:14    [21637549]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    WaspNewCore
    Member

    Откуда:
    Сообщений: 167
    hVostt
    Думаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

    Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?

    Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис.


    await это синтаксический сахар, тригерящий компилятор на создание стейт-машины.
    Вы предлагаете его убрать, чтобы компилятор автоматически распознавал, что метод возвращает Task, и в этом случае создавал стейт-машину ? Но как тогда быть, если мы хотим использовать не await а простой wait - например в консольном приложении ?
    16 авг 18, 18:02    [21644885]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    WaspNewCore
    Member

    Откуда:
    Сообщений: 167
    hVostt
    ЕвгенийВ
    А что в GO такого легкого и простого?
    Ужасные горутины и каналы?
    Просто мерзкая обработка ошибок?
    И никакого ГУЯ!


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

    кстати, в .NET тоже будут каналы, скоро.
    пока в глубокой бете.


    точнее даже не в бете а в альфе вообще 0.1.0-alpha-001 :)
    https://www.nuget.org/packages/System.Threading.Tasks.Channels
    16 авг 18, 18:08    [21644893]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    WaspNewCore,
    В консольном не надо асинхронность (шутка)
    16 авг 18, 18:45    [21644923]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    WaspNewCore
    Member

    Откуда:
    Сообщений: 167
    Petro123,

    Чисто консольные приложения мне не приходится писать. Но вот WinService который может запускаться в консольном режиме - для разработки и отладки - да. Вот там и получается асинхронность. Но все сводится к простому ServiceImpl.Run().Wait().

    Но я просто для примера привел консольное приложение. Что предложение отказаться от старого TPL и сделать все методы с Task'ами вызываемыми с await по умолчанию, не очень наверное правильная. Думаю есть какие-то ситуации, когда осмысленно не задействовать async/await.

    тут вроде что-то похожее обсуждалось
    https://stackoverflow.com/a/24298425
    со ссылками на эти статьи
    https://blogs.msdn.microsoft.com/pfxteam/2012/04/13/should-i-expose-synchronous-wrappers-for-asynchronous-methods/
    https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/

    или я сейчас ошибаюсь.
    16 авг 18, 19:11    [21644947]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Petro123
    Member

    Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
    Сообщений: 38643
    WaspNewCore
    Думаю есть какие-то ситуации, когда осмысленно не задействовать async/await.
    я тоже против "автомата" в данном случае.
    Если бы все поддержали то и 10 страниц бы не было.
    Мне лично хотя бы для читабельности кода нужен оператор.
    Imho
    16 авг 18, 19:18    [21644954]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    Roman Mejtes
    Member

    Откуда: г. Пермь
    Сообщений: 3599
    Просто у автора темы много работы связанной с асинхронным выполнением :) у многих таких проблем нет.
    Это как с пропами, когда много работаешь с UI и моделями, немного раздражает эта писанина, даже с учётом сниппетов. всегда есть вещи, которые хотелось бы сделать проще. Сахара мало не бывает. Но нужно относиться к этому проще, лет 10 назад, всё это было куда большим гемороем
    16 авг 18, 19:40    [21644965]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    WaspNewCore
    await это синтаксический сахар, тригерящий компилятор на создание стейт-машины.
    Вы предлагаете его убрать, чтобы компилятор автоматически распознавал, что метод возвращает Task, и в этом случае создавал стейт-машину ? Но как тогда быть, если мы хотим использовать не await а простой wait - например в консольном приложении ?


    Легко. Метод помечен ключевым словом async. Этого достаточно в абсолютном большинстве случаев. И зачем в асинхронном заведомо методе "простой wait"?
    16 авг 18, 19:50    [21644971]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    hVostt
    Member

    Откуда:
    Сообщений: 16252
    WaspNewCore
    Что предложение отказаться от старого TPL и сделать все методы с Task'ами вызываемыми с await по умолчанию, не очень наверное правильная.


    Я не совсем понял, как TPL кореллирует с TAP? Это немного разные вещи :)
    16 авг 18, 19:52    [21644975]     Ответить | Цитировать Сообщить модератору
     Re: Зачем нужен await?  [new]
    WaspNewCore
    Member

    Откуда:
    Сообщений: 167
    hVostt,

    а где вы увидели эту корелляцию ? ))

    В общем. действительно, раз тема растянулась на 11 страниц, то значит либо мы тут чего-то не понимаем - но понимают microsoft'овцы - и не можем дать четкого ответа который бы сразу закрыл всё обсуждение. Либо действительно все оставлено "чтобы было" - мол кто хочет пользуется, кто не хочет не пользуется.
    17 авг 18, 10:35    [21645569]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3 4 5 6 7 8 9 10 11      [все]
    Все форумы / WinForms, .Net Framework Ответить