powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зачем нужен await?
252 сообщений из 252, показаны все 11 страниц
Зачем нужен await?
    #39681790
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

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

Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681798
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДумаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

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

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

Тебе вообще зачем __асинхронный__ вызов нужен?
Наверное, чтобы он выполнялся параллельно с остальным кодом...
А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681799
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТебе вообще зачем __асинхронный__ вызов нужен?
Наверное, чтобы он выполнялся параллельно с остальным кодом...
А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?

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

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

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

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

2. забыли await, получили проблемы, особенно, если мы не ожидаем результат, а только сам факт асинхронного исполнения (async void).
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681808
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

ситуации разные бывают, с await больше возможностей для разработчика
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
        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("http://www.sql.ru/forum/1300144/zachem-nuzhen-await"))
                .ContinueWith(t =>
                {
                    Console.WriteLine(t.Result.Substring(t.Result.IndexOf("ведь компилятор может определить"), 100));
                });
            // а тут не нужно, ну нет такой необходимости, как компилятор это определит?
            (new WebClient().DownloadStringTaskAsync("http://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));
                    }
                });
        }
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681821
WebSharper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда после введения этой особенности получилось бы нарушение обратной совместимости. До нее тот же самый код бы просто запускал метод. А после нее эвейтил бы таску.

Причем в документации бы пришлось писать что var x = y() ведёт себя по разному для методов возвращающих такску и прочие типы
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681836
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR
Код: c#
1.
2.
3.
4.
5.
6.
            // тут нужно дождаться
            await (new WebClient().DownloadStringTaskAsync("http://www.sql.ru/forum/1300144/zachem-nuzhen-await"))
                .ContinueWith(t =>
                {
                    Console.WriteLine(t.Result.Substring(t.Result.IndexOf("ведь компилятор может определить"), 100));
                });



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

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



По поводу второго "не нужно". Это распространённая ошибка. Если приложение нормально завершит свою работу раньше, чем ваш Task, то работа может быть прервана на середине и код в ContinueWith вообще не выполнится. И без await контекст синхронизации нужно передавать вручную (актуально для UI и для ASP.NET, но не Core).
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681838
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WebSharperТогда после введения этой особенности получилось бы нарушение обратной совместимости. До нее тот же самый код бы просто запускал метод. А после нее эвейтил бы таску.

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

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

Если бы async был частью контракта, а не реализации, то компилятор бы скрывал таску, y() при этом возвращал результат функции, а не awaitable объект в контексте использования. Проблема в том, что возвращаемый результат типа Task ещё не говорит о том, что это асинхронный метод.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681856
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivhVosttДумаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

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

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

Тебе вообще зачем __асинхронный__ вызов нужен?
Наверное, чтобы он выполнялся параллельно с остальным кодом...
А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?
+1
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681858
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПо поводу второго "не нужно". Это распространённая ошибка. Если приложение нормально завершит свою работу раньше, чем ваш Task, то работа может быть прервана на середине и код в ContinueWith вообще не выполнится. И без await контекст синхронизации нужно передавать вручную (актуально для UI и для ASP.NET, но не Core).
Это не ошибка, так задумано, если задание не выполнится до окончания работы приложения - это нормально, иначе задумано с sometask. Повторю, ситуации могут быть разными, await дает еще одну степень свободы - и это хорошо.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681868
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?
как вы правильно после заметили это не контракт, а реализация. контрактом является возврат интерфейса в котором есть управление задачей и получение результата. Т.е. компилятор не может вызвать метод асинхронно, await - синтаксический сахар, он просто вызывает методы ожидания возвращаемого интерфейса и попутно трасирует в него часть своей реализации.
Принципиальной проблемы в использовании await вне асинхронного метода нет, собственнно в плюсах так можно делать без проблем.

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

запоминать что переменная не переменная и её нужно проверять? тогда встаёт вопрос эффективности, фактически придётся делать ленивый вызов при использовании переменной, следить за ней, что в массовом порядке накладно.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681960
WebSharper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТ.е. кроме обратной совместимости, других проблем вы не видите?
Думаете, если бы язык проектировался заново, типа новая супер-мажорная версия, без обратной совместимости, от ключевого слова await могли бы отказаться?


При этом можно было бы ввести другое умолчание (соответственно для поведения когда мы продолжаем исполнение, а не возвращаем управление вызвавшему методу).
Т.е. у нас есть 3 действия - получить таску и что-то с ней сделать. Вернуть управление вызвавшему методу. Подождать пока вызванный метод закончится. Нам их надо как-то разграничить.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681964
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRЭто не ошибка, так задумано, если задание не выполнится до окончания работы приложения - это нормально, иначе задумано с sometask. Повторю, ситуации могут быть разными, await дает еще одну степень свободы - и это хорошо.

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

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

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

Проблема в том, что "ещё одна степень свободы" выливается в описанные выше мною проблемы.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681969
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)как вы правильно после заметили это не контракт, а реализация. контрактом является возврат интерфейса в котором есть управление задачей и получение результата. Т.е. компилятор не может вызвать метод асинхронно, await - синтаксический сахар, он просто вызывает методы ожидания возвращаемого интерфейса и попутно трасирует в него часть своей реализации.

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

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

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

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

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

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

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

Давайте напомню, в JavaScript нельзя выполнить код параллельно. Можно выполнить
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681973
WebSharper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681976
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.. можно выполнить код асинхронно.

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

При наличии контракта, видим, что метод асинхронный, значит выполняем его асинхронно. Т.е. компилятор сам вставляет await там, где он итак должен был быть написан программистом.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39681999
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WebSharper https://softwareengineering.stackexchange.com/questions/328087/why-are-promises-not-awaited-by-default

SONote 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, это является проблемой. но и она решается точно также, как решаются все остальные проблемы отсутствия типизации.

в общем, пока только обратная совместимость выглядит как преграда.
ну ещё несколько лет нужно, чтобы люди привыкли к парадигме.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682001
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

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

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

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


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


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


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

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

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

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

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

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

Код: c#
1.
2.
a =AsyncMet1(d);
c = a + b;


куда физически вставлять await?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682013
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt.. можно выполнить код асинхронно.

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

При наличии контракта, видим, что метод асинхронный, значит выполняем его асинхронно. Т.е. компилятор сам вставляет await там, где он итак должен был быть написан программистом.ещё раз повторю: "асинхронный метод в реализации шарпа значит, что возвращается контракт на получение значения"
т.е. в нативе это какой-то стаб который, например, кидает задачу в пул на выполнение своего кода и возвращает интерфейс по ожиданию его завершения\отмены\получению результата и пр.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682042
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)ему вообще по барабану, у компилятора только контракт на ожидание выполнения непонятно чего

Код: c#
1.
2.
a = await AsyncMet1(d);
c = a + b;



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

Вот сюда. И только при условии, что метод, в котором находится этот код помечен как async.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682044
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)т.е. в нативе это какой-то стаб который, например, кидает задачу в пул на выполнение своего кода и возвращает интерфейс по ожиданию его завершения\отмены\получению результата и пр.

Т.е. будете ждать выполнение i/o операций на выделенном пуле потоков? Мдя...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682046
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно?

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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;
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682062
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BЕсли я правильно понял, то ты хотел предложить не использовать await ?

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


Valery_B
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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 , значит вызов любой асинхронной функции должен быть асинхронным, если это не указано каким-то определённым образом иначе.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682065
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private async AwaitableResult<string> GetExpensiveStringAsync()
{
    // можно было бы добавить
    /* await */ Task.Yield();
    //
    Thread.Sleep(10000);
    return "Hello world";
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682069
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttkealon(Ruslan)как это всё выглядит изнутри плюсов:
вызвали аснхронный метод, собственно он возвращает контракт IASync<T>
и тут можно с ним делать что угодно: подождать вызвать другой метод и пр.


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


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

Куда вставляет? Кто код ожидания будет выполнять? Что там со стеком? Могу ли я ожидать огромное количество асинхронных операций, с небольшим количеством рабочих потоков?ожидание выполняет реализатор контракта IAsync<T>
в частности с IO, для этого достаточно текущую нить отдать "планировщику" и переключиться на выполнение другой задачи.
Можете
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682077
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
private async void Button1Click(object sender, EventArgs e)
{
    // а такое очевидно
    // и это асинхронный вызов!
    label1.Text = "Please wait";   
    label1.Text = GetExpensiveStringAsync();
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682078
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)не выдумывайте, там обычный линейный код

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

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

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

Мне-то что хотите доказать? Я вопрос и проблемы в начале топика озвучил. Они не критичные, но с ними пришлось столкнуться.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682080
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BДля меня как раз наоборот - первый случай абсолютно очевиден, а второй - наоборот.
Не понятно, что должна сделать эта процедура выполняя первый и второй оператор.
И в каком потоке.

Код: c#
1.
2.
3.
4.
5.
6.
7.
private async void Button1Click(object sender, EventArgs e)
{
    // а такое очевидно
    // и это асинхронный вызов!
    label1.Text = "Please wait";   
    label1.Text = GetExpensiveStringAsync();
}



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

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

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

Просто этого нет пока, надо вручную писать много await и это печалит.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682099
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМне-то что хотите доказать? Я вопрос и проблемы в начале топика озвучил. Они не критичные, но с ними пришлось столкнуться.вы совершенно не понимаете как это работает, хуже того - вы себе что-то насочиняли

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

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

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

по вашему
Код: c#
1.
2.
AsyncMet1();
AsyncMet2();



должен преобразоваться в
Код: c#
1.
2.
await AsyncMet1();
await AsyncMet2();


ну-ну...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682103
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)по вашему
Код: c#
1.
2.
AsyncMet1();
AsyncMet2();



должен преобразоваться в
Код: c#
1.
2.
await AsyncMet1();
await AsyncMet2();


ну-ну...
Если эти вызовы производятся из async-метода, то да, хотя бы один из этих двух вызовов должен быть с await, иначе сам метод будет выполняться синхронно (и это вполне логично).
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682106
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

че то ты где то не понял :(
async await {censored} не нужны
Модератор: Просьба подбирать слова покультурнее
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682111
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 15:11 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21621456] [21621456]

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

<На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так:
Код: c#
1.
2.
3.
4.
5.
private async void ЗапросДанных() {
 . . .
 await Task.Run(() => wsp.Entity_SP("...
 . . .
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682112
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 15:11 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21621456] [21621456]

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

<На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так:
Код: c#
1.
2.
3.
4.
5.
private async void ЗапросДанных() {
 . . .
 await Task.Run(() => wsp.Entity_SP("...
 . . .
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682114
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)на дуболомный вопрос MasterZiv-а у вас нет ответа

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


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

по вашему
Код: c#
1.
2.
AsyncMet1();
AsyncMet2();




должен преобразоваться в
Код: c#
1.
2.
await AsyncMet1();
await AsyncMet2();



Мда.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682116
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

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

В контексте твоих проектов, не особо нужны.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682118
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев<На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так:
Код: c#
1.
2.
3.
4.
5.
private async void ЗапросДанных() {
 . . .
 await Task.Run(() => wsp.Entity_SP("...
 . . .
}



Но это не асинхронный вызов. Это асинхронное ожидание, в этом случае блокируется отдельно выделенный поток для абсолютно синхронного выполнения i/o операции.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682129
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев<На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так:
Код: c#
1.
2.
3.
4.
5.
private async void ЗапросДанных() {
 . . .
 await Task.Run(() => wsp.Entity_SP("...
 . . .
}


Компилятор мог бы для всех task-ов "докинуть" await, это не проблема... Проблема, если разработчику понадобиться более гибкая схема, например
async ... Method()
{
task1.Start();
task2.Start();
await task1;
}
и где-то в другом месте
task2.Wait();
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682132
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRЕсли эти вызовы производятся из async-метода, то да, хотя бы один из этих двух вызовов должен быть с await, иначе сам метод будет выполняться синхронно (и это вполне логично).нет (то что выдаются красивые варнинги - они не по этому поводу и ничего не меняют), просто потеряешь контроль над выполнением и без дополнительных танцев не узнаешь когда в действительности выполнятся оба метода.

просто проверить не судьба я так понимаю ...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682140
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682142
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
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();
        }
    }
}


Код: plaintext
1.
2.
3.
t1 = 0
18
t1 = 1000
t1 = 2000
занятно, да?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682145
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. эта фраза никак не противоречит моим словам, просто понимаешь ты её неправильно
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682162
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)занятно, да?
Ничего занятного. Асинхронный метод здесь нужен лишь в одном месте, и, разумеется, с await.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
    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)эта фраза никак не противоречит моим словам, просто понимаешь ты её неправильно
Да уж, вижу)))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682169
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRАсинхронный метод здесь нужен лишь в одном месте
А, возможно, и не нужен вовсе... Смысл async-метода во фразе из приведенной цитаты: "When the task completes, it invokes its continuation, and execution of the async method resumes where it left off." Если никакого продолжения нет, или продолжение не использует результаты task-ов, то какой смысл городить async-метод?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682177
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 16:22 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21621776] [21621776]

>Но это не асинхронный вызов. Это асинхронное ожидание,...
<Называйте как хотите, но вторя Вам - асинхронный вызов мне нужен, чтобы I/O операции не блокировали UI поток. Иногда асинхронные операции с базой данных только называются асинхронными (суффикс Async присутствует), на самом деле метод выполняется синхронно. Используемая конструкция реализует асинхронность(параллельность) выполнения I/O.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682197
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

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

ноLRЕсли никакого продолжения нет, или продолжение не использует результаты task-ов, то какой смысл городить async-метод? направление мыслей уже правильное
глядишь уже сможешь понять 21619662
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682209
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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...
и думаем...думаем...думаем...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682210
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRМдя)) Почитать документацию и узнать что такое async-методы не судьба, я так понимаю...\

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

Я понимаю, даже не удосужился почитать, не имел дела, да и понятия не имеет о чём идёт речь, но своё однозначное мнение имеет
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682212
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)глядишь уже сможешь понять 21619662
Там слишком глубокий вопрос. В C# все прозаически банально: async/await надо для отзывчивости гуя. Чтобы клик по кнопке не завесил прогу. По встрече await дальнейший код уходит в другой поток, освобождается поток обработки сообщений, тот принимает следующее сообщение виндовса и т.д. Плюсом await дает написать хорошо читаемый код, т.е. синтаксический сахар в чистом виде.

В остальном от async/await пользы не много. Я консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync().
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682213
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевНазывайте как хотите, но вторя Вам - асинхронный вызов мне нужен, чтобы I/O операции не блокировали UI поток.

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


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

Нет, I/O здесь выполняется синхронно, в синхронном коде. Вы просто реализуете асинхронное ожидание результата. Но если так нравится, используйте ради бога, но это немного за рамками топике.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682214
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)направление мыслей уже правильное
глядишь уже сможешь понять 21619662

Вот эти глупости может прекратите копипастить?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682216
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТам слишком глубокий вопрос. В C# все прозаически банально: async/await надо для отзывчивости гуя. Чтобы клик по кнопке не завесил прогу. По встрече await дальнейший код уходит в другой поток, освобождается поток обработки сообщений, тот принимает следующее сообщение виндовса и т.д. Плюсом await дает написать хорошо читаемый код, т.е. синтаксический сахар в чистом виде.

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

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

Прозаически банально это в вашем воображении. Нет, async/await нужен вовсе не только для отзывчивости гуя, это прекрасно решали ещё 10 лет назад, существует как минимум 2 асинхронных API, до появления TAP. Но я сомневаюсь, что вы о них вообще слышали.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682218
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync().

Ну ясно. Если практика этим заканчивается, async/await вообще здесь не к месту.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682219
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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...
и думаем...думаем...думаем...

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

Я честно говоря, вообще в глубоком шоке.
Не думал, что придётся столкнуться с подобным невежеством.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682224
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttсуществует как минимум 2 асинхронных API, до появления TAP. Но я сомневаюсь, что вы о них вообще слышали.
Слышал, т.е. читал :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682225
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRMasterZivТебе вообще зачем __асинхронный__ вызов нужен?
Наверное, чтобы он выполнялся параллельно с остальным кодом...
А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?
еще раз (а лучше два или три) перечитываем (эту гребаную) документацию
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 что бы всё встало на свои места

а уж потом изучать патерны
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682227
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик ушел в сторону обсуждения реализации async/await в .net, как оно на других ЯП никто не пишет, поэтому топик переезжает в профильный форум.

Модератор: Тема перенесена из форума "Программирование".
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682233
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)банальная фраза, она говорит что когда твоя задача занята ожиданием в await, нет никаких гарантий что она блокирует исполняющий её поток и он не может в это время заниматься какими-то другими делами

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


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

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

при чём тут ваши нативные вызовы из WinRT, если async/await это конструкция языка, вы в отладчике await собрались искать?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682237
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТопик ушел в сторону обсуждения реализации async/await в .net, как оно на других ЯП никто не пишет, поэтому топик переезжает в профильный форум.

а так-то однопоточный JavaScript напрямую противоречит первому же ответу в топике
но.. топик охватывает все языки, реализующие паттерн async/await.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682239
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttDima TЯ консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync().

Ну ясно. Если практика этим заканчивается, async/await вообще здесь не к месту.
Т.е. ты признаешь что async/await не везде уместны? Тогда уточни где они уместны. Я один кейс обозначил - гуй, а еще где?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682243
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttMasterZivТебе вообще зачем __асинхронный__ вызов нужен?
Наверное, чтобы он выполнялся параллельно с остальным кодом...
А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова?

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

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

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

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

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

Мне кажется, что на этом шатком основании ты пытаешься что то доказать.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682246
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена.

С т.зрения Яваскриптера все вокруг это только браузер
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682250
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТ.е. ты признаешь что async/await не везде уместны? Тогда уточни где они уместны. Я один кейс обозначил - гуй, а еще где?

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

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

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

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

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

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

Всё это хорошо, за исключением обозначенных мною проблем в начале топика.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682251
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglА ты уверен, что в текущих ОС, концепция async/await реализуема без многопоточки ?

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


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

Тебе не просто кажется, это какие-то фантазии. Я ничего не пытаюсь доказать, я озвучил проблемы. Но как оказалось, народ в большинстве даже не понимает что это такое и с чем это едят.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682253
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglЭто я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена.

Верно, поэтому хотелось бы в прикладном коде работать с асинхронными вызовами и не задумываться о том, что они асинхронные. Сейчас приходится вставлять await. А я уверен, что без этого можно было бы обойтись :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682258
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 19:36 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21622273] [21622273]
>Нет, I/O здесь выполняется синхронно, в синхронном коде. Вы просто реализуете асинхронное ожидание результата…
<Я видимо что-то не понимаю, вот код:
при.tmrStart(); await Task.Run(() => wsp.Entity_SP("NCUYAO_GIS.VD_Inspek_Sel", wsp.sp_Sel, psp, RowToEntity)); при.tmrStop();

запрос выполняется параллельно с демонстрацией прогресбара
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682260
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевзапрос выполняется параллельно с демонстрацией прогресбара

Запрос выполняется синхронно в параллельном потоке. Так как у вас десктопное приложение, которое выполняется монопольно для одного единственного пользователя, вы можете использовать потоки для реализации асинхронного поведения при запросах к БД, при условии, что их относительно не много, и нисколько не пострадать от этого.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682281
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttSiemarglЭто я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена.

Верно, поэтому хотелось бы в прикладном коде работать с асинхронными вызовами и не задумываться о том, что они асинхронные. Сейчас приходится вставлять await. А я уверен, что без этого можно было бы обойтись :)Ты плачешь, что синтакс сахар недостаточно сладкий?!
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682282
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Компьютер/компилятор тупой, подсказка с твоей стороны с await может только улучшить его работу.

Например представь, что он попытается параллелить все операции (а почему бы и нет - выч блоков то у ЦПУ много)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682285
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например, все лямбды без захвата по ссылке можно запускать асинхронно. а вот выгодно ли ?

рановато еще, не доросли компилеры
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682293
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttkealon(Ruslan)достаточно посмотреть в отладчике нативные вызовы WinRT что бы всё встало на свои места

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

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

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

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

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

PS: Вера это конечно прикольно, но при споре об устройстве системы с системщиком её одной мало. Cкрины из системного отладчика были бы гораздо убедительнее
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682318
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМы переписали код на использование async/await, логика и всё остальное осталось неизменным. В период следующих пиковых нагрузок, один единственный сервер уже с лёгкостью справлялся, хотя нагрузка даже увеличилась.у меня не вышло оставить логику.
Унаследованный проект и вызов бд, сервиса был глубоко в стеке из 10 методов.
А await требует выхода сразу наверх из стека.
Т.е. он не запоминает код выше уровнем чтобы его потом продолжить. Только в этом же методе.
Пришлось убирать стек и переписать все 10 методов(.
Прискорбно.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682320
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglТы плачешь, что синтакс сахар недостаточно сладкий?!

Я вроде озвучил проблемы в начале топика.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682321
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglКомпьютер/компилятор тупой, подсказка с твоей стороны с await может только улучшить его работу.

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

Он не пытается распараллелить async/await, это про другое.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682323
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglнапример, все лямбды без захвата по ссылке можно запускать асинхронно. а вот выгодно ли ?
рановато еще, не доросли компилеры

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

код с async/await с точки зрения потока исполнения не имеет ничего общего с параллелизмом.
поэтому вы не можете, например, использовать блокировки потока. только семафоры.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682324
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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крины из системного отладчика были бы гораздо убедительнее

Вы похожи на бабку возле подъезда, которая с ходу ставит точный диагноз любому проходящему мимо мужчине или женщине. Нашли же себе занятие. Детский сад.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682331
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123у меня не вышло оставить логику.
Унаследованный проект и вызов бд, сервиса был глубоко в стеке из 10 методов.

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

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

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

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

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

3. (опционально) некоторым не нравится, что отлаживаться под async/await сложнее, чем с синхронным кодом. но это потому что они до этого вообще не работали с асинхронным кодом, раньше было ещё сложнее :) но обещают улучшить ситуацию, правда меня это особо не трогает.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682335
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 полностью лежит на функции которая его вернула

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

Под капотом асинхронного IO .net использует надстройку над виндовым I/O Completion Port . По ссылке подробно расписано как он устроен.
Если кратко: виндовсу дается задание на чтение или запись и освобождается текущий поток, как только задание выполняется, виндовс будит один из потоков-обработчиков из заранее созданного пула.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682340
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДостали вы меня, в C++ есть async/await? Нету.
Вообще то есть. Сделано через концепцию future/promise
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682346
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Но это не важно.

Вы видели мой вопрос в начале топика? Я говорил где-то, а давайте обсудим сам паттерн, нужен ли он вообще, как он устроен, чё там видно в дебагере и т.п.? Может хватит офтопить? Или давайте заведём отдельную тему, где обсудим эти вопросы?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682347
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПолистал Рихтера "CLR via C# 4-е издание" Глава 28. Асинхронные операции ввода-вывода.
Подробно разжевано как устроены async/await (целиком читал 3-е издание, надо уже собраться и это прочитать)

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

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

Только эта же реализация использовалась и ранее, на устаревшем асинхронном API (APM, EAP), просто из-за её неудобств, абсолютное большинство вообще не знали что это такое и как этим пользоваться. Просто запускали фоновые потоки для асинхронного поведения.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682348
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglhVosttДостали вы меня, в C++ есть async/await? Нету.
Вообще то есть. Сделано через концепцию future/promise

Это другой паттерн.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682355
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttkealon(Ruslan)утверждение MasterZiv построено от противного, он чётко выводит "так нафига они тогда нужны?", а ответа у вас нету

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

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

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

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

hVosttkealon(Ruslan)если копаться в кишка всей этой конструкции:
в .Net и WinRT метод помеченный async это контракт на поставку интерфейса IAsync<t>

для метода помеченного как async компилятор делает "загрузочный" стаб , на экспорт идёт загрузочный стаб

await это лишь синтаксический сахар, который вызывает IAsync<t>.Wait (попутные действия пока пропустим)

реализация IAsync<t>.Wait полностью лежит на функции которая его вернула

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

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

Вы видели мой вопрос в начале топика? Я говорил где-то, а давайте обсудим сам паттерн, нужен ли он вообще, как он устроен, чё там видно в дебагере и т.п.? Может хватит офтопить? Или давайте заведём отдельную тему, где обсудим эти вопросы?
я их с натива дёргаю, а ты говоришь что это всё мистика, ты адекватный?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682364
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttSiemarglпропущено...
Вообще то есть. Сделано через концепцию future/promise
Это другой паттерн.Я смотрю MSIL и вижу ту же самую реализацию.


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

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

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

Приведи что ли кусок кода, где ты считаешь его ненужным.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682376
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично. Есть
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682383
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
// 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;
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682385
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно :(
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682388
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПонятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её,

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

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

Ну и всё. )
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682392
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)упустим ваши современные английские манеры

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

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

В нативе нет никаких async/await, в чём ваша проблема, не пойму?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682393
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglЯ смотрю MSIL и вижу ту же самую реализацию.

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


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

Мне нужен await, но считаю, что использование ключевого слова в большинстве случаев избыточно.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682394
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично. Есть

Ок, сейчас проверим.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682395
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

наверное всегда избыточно
await можно поставить автоматом всегда (ну, вроде как)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682396
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомНу так а какие аргументы еще нужны?

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

Ну и всё. )

В смысле, потом? )
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682397
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

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

Я тоже так думаю, благодаря ключевому слову async для блока метода, компилятор понимает, что тело может содержать асинхронные вызовы.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682400
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ тоже так думаю, благодаря ключевому слову async для блока метода, компилятор понимает, что тело может содержать асинхронные вызовы.
Может, но необязательно содержит, кроме того, метод может возвращать Task, но не содержать асинхронных вызовов и ключевого слова asynс
А еще может понадобиться запустить асинхронный метод и не ждать его окончания.
А еще есть async void - асинхронные методы, которые не получится ждать
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682402
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRoshVostt,

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

Я тоже так думаю, благодаря ключевому слову async для блока метода, компилятор понимает, что тело может содержать асинхронные вызовы.
Это необходимо, но недостаточно.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682404
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен еще анализ - есть ли обращение к TaskResult где нить
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682407
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И воще еще раз возвращаюсь к тому что надо было явно выделить (не через соглашение, а как свойство таск) I/O Port таски и тогда не было бы путаницы этой и не надо было писать асунк-авайт вообще
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682408
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично. Есть

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

Код: xml
1.
<WarningsAsErrors>CS4014,CS1998</WarningsAsErrors>



Это снимает проблему №2 :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682409
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProМожет, но необязательно содержит, кроме того, метод может возвращать Task, но не содержать асинхронных вызовов и ключевого слова asynс
А еще может понадобиться запустить асинхронный метод и не ждать его окончания.
А еще есть async void - асинхронные методы, которые не получится ждать

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

Насчёт async void, ща так делать моветон :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682410
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosНужен еще анализ - есть ли обращение к TaskResult где нить

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

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

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

Например, правайдер оракла до сих пор не умеет async. Поэтому вызовы нужно оборачивать в Task.Run, чтобы интерфейсы не ломать.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682411
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАгнец за бортомНу так а какие аргументы еще нужны?

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

Ну и всё. )

В смысле, потом? )
Никто же не запретит использовать к примеру такую "конструкцию"
Код: c#
1.
2.
3.
4.
5.
6.
object x;
async void Dosmth()
{
    Meth1async();
    x = Meth2async();
}


компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682412
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНасчёт async void, ща так делать моветон :)Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682414
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRhVosttпропущено...


В смысле, потом? )
Никто же не запретит использовать к примеру такую "конструкцию"
Код: c#
1.
2.
3.
4.
5.
6.
object x;
async void Dosmth()
{
    Meth1async();
    x = Meth2async();
}


компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто...
Не просто, но можно
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682415
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosНужен еще анализ - есть ли обращение к TaskResult где нить

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


Как без разницы? А если запустил и забыл? Разве тут нужен await? (я только читал, не писал)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682418
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАгнец за бортомНу так а какие аргументы еще нужны?

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

Ну и всё. )

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

Ты сам сказал, собрать всё в коллекцию и дождаться их парралельно.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682421
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosНе просто, но можно
Ну, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task - сможет ли компилятор отследить все лабиринты мысли хитроумного разработчика?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682423
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRViPRosНе просто, но можно
Ну, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task - сможет ли компилятор отследить все лабиринты мысли хитроумного разработчика?
во всяком случае я бы мог это прогить :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682426
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRНикто же не запретит использовать к примеру такую "конструкцию"
Код: c#
1.
2.
3.
4.
5.
6.
object x;
async void Dosmth()
{
    Meth1async();
    x = Meth2async();
}



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

Пока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682427
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttНасчёт async void, ща так делать моветон :)Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий.

Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682428
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosКак без разницы? А если запустил и забыл? Разве тут нужен await? (я только читал, не писал)

"Запустил и забыл" нужно делать через управляемый менеджер задач, в самом примитивном случае, Task.Run.
Но это по фуншую )
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682429
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttLRНикто же не запретит использовать к примеру такую "конструкцию"
Код: c#
1.
2.
3.
4.
5.
6.
object x;
async void Dosmth()
{
    Meth1async();
    x = Meth2async();
}



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

Пока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :)
Это не очевидно
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682430
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :)
LRНу, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682432
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомТы сам сказал, собрать всё в коллекцию и дождаться их парралельно.

Да, здесь требуется ручное управление, поэтому нужен специальный синтаксис для таких довольно редких случаев. Я не думал пока об этом )
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682433
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosЭто не очевидно

Почему? Вроде очевидно.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682435
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

все это можно разрулить автоматом
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682436
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRНу, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task

Тогда никак, только ручной await. Ну это совсем дикие примеры )
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682437
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosЭто не очевидно

Почему? Вроде очевидно.
нет
там await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682438
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

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

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

Да, придётся рулить автоматом.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682439
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosтам await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет)

Приведение должно быть типа таким (async Task), потому что Task ещё не говорит об асинхронности.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682443
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosтам await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет)

Приведение должно быть типа таким (async Task), потому что Task ещё не говорит об асинхронности.
по любому, только приведение скажет - нежен await или нет
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682444
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно
или косвенно await не нужен)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682448
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosвощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно
или косвенно await не нужен)
Тогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен)))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682450
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRТогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен)))

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

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

Код: c#
1.
2.
string ! s = "blablabla";
s = null; // ERROR!



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

так же и с асинком (async Task)value и (Task)value, взяли и скрыли async от компилятора :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682455
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRViPRosвощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно
или косвенно await не нужен)
Тогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен)))
угу
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682458
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следующий вопрос, может кто решал.

Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682473
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКак заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)замена в исходниках по регулярке )))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682479
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttShocker.Proпропущено...
Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий.

Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)нет.
У меня проект, где я в цикле делаю await и результат мне нужен без Task<...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682480
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСледующий вопрос, может кто решал.

Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)Да никак. Но можно локально убить контекст синхронизации.
Код: c#
1.
2.
3.
4.
Task.Run(async () =>
{
    ...
});
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682482
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123hVosttпропущено...


Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)нет.
У меня проект, где я в цикле делаю await и результат мне нужен без Task<...причем тут результат и void???
Так или иначе ты можешь запустить метод с таском без ожидания результата, для этого тебе void необязателен.
Как правильно говорит Хвост, void оставлен только для сохранения сигнатуры для событий
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682486
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КДа никак. Но можно локально убить контекст синхронизации.
Код: c#
1.
2.
3.
4.
Task.Run(async () =>
{
    ...
});



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

В общем, тут очевидно, что сделали слегка по-дебильному.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682490
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВ общем, тут очевидно, что сделали слегка по-дебильному.Слегка - не то слово!
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682493
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Ты про то чтобы убрать слово void тут?
private async void MyRun()
Ну, это и коню понятно что не надо трогать.
Чтобы убрать await я тоже против.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682496
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, Ещё камень в авторов ConfigureAwait .
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682497
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt, Ещё камень в авторов ConfigureAwait .

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

Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682499
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНо сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации Ну да. HttpContext.Current там нет, а значит и контекст синхронизации там ни к чему.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682501
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Библиотеки все таки не часто пишем.
А core пока ещё не ГУИ.
Так что пока не наезжайте на сабж) сильно.
))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682505
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСогласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false).

Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации Но временнЫе затраты на переключение контекста ведь никто не отменял...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682509
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttСогласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false).

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

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

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

Но такие вещи нужно применять с осторожностью.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39683112
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttКак заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)замена в исходниках по регулярке )))
У нас есть Roslyn
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684143
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt, Ещё камень в авторов ConfigureAwait .
Это далеко не все тараканы

https://www.infoworld.com/article/2960463/application-development/my-two-cents-on-synchronizationcontext-async-and-await.html
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684149
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684255
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

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

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private void button1_Click(object sender, EventArgs e)
{
    button1.Text = await Task.Run(async delegate
    {
        string data = await DownloadAsync();
        return Compute(data);
    });
}



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

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

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

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
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. включим мозг и напишем по-людски

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private void button1_Click(object sender, EventArgs e)
{
    string data = await DownloadAsync();

    // если вычислительная операция действительно сложная и долговременная, 
    // запустим в отдельном потоке
    button1.Text = await Task.Run(() => Compute(data));

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

    // а вот все IO операции должны быть асинк
}



Глобально решают задачу, отказываюсь от контекста синхронизации совсем. Остаётся execution flow, и с блокировками нужно по-аккуратнее.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684257
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё в примере есть небольшой косячок, надо так :)

Код: c#
1.
private async Task button1_Click(object sender, EventArgs e)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684276
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
private async Task button1_Click(object sender, EventArgs e)

почему Task - это ж эвентхендлер?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684280
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда.Придется показать себя неучем. Почему Compute будет выполняться в UI потоке (без ConfigureAwait(false)), если мы до этого уже эвеитим задачу, в которой должен быть выполнен делегат, то есть он уже как бы начал выполняться не в потоке UI, и возврат из DownloadAsync должен быть не в поток UI, а в поток, в котором выполняется задача из пула. Или я где-то недопонял с возвратом. ((
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684281
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда.
Наверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684282
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

опередили)))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684323
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпочему Task - это ж эвентхендлер?

да, void, но всё равно async ))
давненько за десктоп не брался
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684325
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
button1.Text = await Task.Run(() => Compute(data));


Можно так:
Compute(){
.......
Action a = () => метод в гуи
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684334
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПридется показать себя неучем. Почему Compute будет выполняться в UI потоке (без ConfigureAwait(false)), если мы до этого уже эвеитим задачу, в которой должен быть выполнен делегат, то есть он уже как бы начал выполняться не в потоке UI, и возврат из DownloadAsync должен быть не в поток UI, а в поток, в котором выполняется задача из пула. Или я где-то недопонял с возвратом. ((

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

главное понимать, что Task это не поток.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684336
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRНаверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?

нет, никакого ожидания не будет, точнее будет то, что называется асинхронным ожиданием, но это по сути метафора к тому, что происходит на самом деле
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684354
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttтам же await, который не блокирует поток. ContinueAwait(false) позволяет выполнить оставшуюся часть метода любым из свободных потоков, даже тем, который был использован для запуска задачи.

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

Где я ошибаюсь?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684361
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttнет, никакого ожидания не будет, точнее будет то, что называется асинхронным ожиданием, но это по сути метафора к тому, что происходит на самом деле
это да, пусть будет "метафора", но лучше метафора об ожидании, чем об выполнении в UI-потоке
hVosttвыполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке
о каком выполнении в UI-потоке идет речь?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684370
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRНаверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?
Наверное правильнее сказать, что выполнение UI потока будет продолжено в той точке, в которой завершится выполнение задачи.
Во время выполнения той задачи UI поток свободно может выполнять другие задачи, те же обслуживания выполнения других событий.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684377
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВLRНаверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?
Наверное правильнее сказать, что выполнение UI потока будет продолжено в той точке, в которой завершится выполнение задачи.
Во время выполнения той задачи UI поток свободно может выполнять другие задачи, те же обслуживания выполнения других событий.
Пожалуй, что и так... Но длинновато, проще сказать, что UI поток будет "поджидать" в той точке...)))
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 = "Подкараулили!";
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684415
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин)))
await оператор ожидания.
Назовите его GoTo, каллбэк и т.д. и т.п.
Слова поток можно не употреблять.
Кому как нравится.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684446
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Блин)))
await оператор ожидания.
Назовите его GoTo, каллбэк и т.д. и т.п.
Слова поток можно не употреблять.
Кому как нравится.
await - не оператор ожидания!
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684459
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 и пошёл гулять. Он как разнорабочий, залил цементный раствор и пошёл курить, или ещё что-то делать. Мимо проходил другой или тот же самый рабочий, увидел, что цемент застыл и продолжил начатую работу здесь. А главный поток это Прораб, который по умолчанию поручает, чтобы его звали каждый раз, когда длительная операция закончится (застывание цемента, например). Без него ничего не может продолжится, если не сконфигурировано иначе.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684460
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRо каком выполнении в UI-потоке идет речь?

О синхронном коде.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684470
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВPetro123Блин)))
await оператор ожидания.
Назовите его GoTo, каллбэк и т.д. и т.п.
Слова поток можно не употреблять.
Кому как нравится.
await - не оператор ожидания!
Смешно.
Оператор await используется для ожидания
Так подходит?))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684474
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поможет только внимательный разбор исходников
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684475
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

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

Тревожное ожидание (лучше бы - тревожная работа (работаешь(отдыхаешь) и ждешь звоночка))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684477
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилПоможет только внимательный разбор исходников
Поможет внимательное прочтение асинхронного ввода/вывода в Windows NT
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684483
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

Это зависит от конфигурации await вызова, и работает для кода продолжения, но контекст синхронизации не назначается потоку, как это можно сделать старым способом через Post или через шедулер.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684491
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosИзопропилПоможет только внимательный разбор исходников
Поможет внимательное прочтение асинхронного ввода/вывода в Windows NT
этого недостаточно.
он сильно проще и логичнее в NT
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684494
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRhVostt,

в той статье автор пространно размышлял примерно так: "В таск перетекает 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.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684503
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилвроде как всё понятно
да, и касательно 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
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684558
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttShocker.ProПри отсутствии ConfigureAwait(false) после завершения DownloadAsync выполнение должно вернуться в поток В и в нем выполниться Compute

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

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

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

Статья ясности не внесла - там нет каскадного await-а
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684595
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Petro123, вчера, 19:17 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21633388][21633388]
>...Оператор await используется для ожидания.
<Может быть так:
В коде вызывающего метода оператор await используется для ожидания завершения кода вызванного метода. Коды других методов, обработчиков сообщений, могут работать асинхронно.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684596
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИтак, UI-поток запустил делегат на потоке из пула (А). Когда делегат закончит выполнение, тогда будет продолжение в UI-потоке (а именно, выполнится присвоение button1.Text =)

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

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


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

Ты всё ещё думаешь, что после выполнения асинхронного метода есть какой-то поток А, который запустил DownloadAsync и теперь сидит ждёт, когда он выполнится :) После запуска асинхронного метода, поток освободился, и где будет выполнятся продолжение метода теперь зависит от ConfigureAwait.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684623
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТы думаешь, что UI-поток получит управление только в точке вызова Task, т.е. на момент присвоения button1.Text, но это не так. UI-поток подключится после любого await, не важно какой каскад функций был вызван внутри, если не сконфигурировано иначе.
Откуда такое заблуждение? Вся та статья как раз и посвящена доказательству того что это не так (что контекст синхронизации не переходит через await, а значит, если вызов async-метода производится не из UI-потока, то и продолжение не будет выполнятся в UI-потоке, что бы там в ConfigureAwait не задавалось).
Вот как в этой точке UI-поток может получить управление?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
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);
    });
}


Разве что так, но ведь разговор идет вовсе не об этом
Код: c#
1.
2.
3.
4.
5.
6.
var sc = SynchronizationContext.Current;
...
sc.Post(new SendOrPostCallback((o) =>
{
     button1.Text = "только через SynchronizationContext.Post и подобное";
}), null);
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684624
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttчто после выполнения асинхронного метода есть какой-то поток АТо есть именно этот поток может уже и не существовать, когда возникает необходимость продолжения, ок, это дошло.

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

Получается, что если ConfigureAwait(false) где-то забыл, то мы получим продолжение в контексте синхронизации независимо от глубины вложенности await-ов. При этом если забыли ConfigureAwait(false) на N-ом уровне вложенности, продолжение N-ого уровня выполнится в UI-потоке, и все по цепочке N-1, N-2... обратно к началу вызовов начнет выполняться в UI-потоке, потому что ConfigureAwait(false) разрешит не менять поток при продолжении. Теперь я правильно понял?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684650
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключение
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684652
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключениеConfigureAwait(false) разрешает выполнять продолжение в том же потоке, но меня пока интересует обратная ситуация...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684674
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>Petro123, вчера, 19:17 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21633388][21633388]
>...Оператор await используется для ожидания.
<Может быть так:
В коде вызывающего метода оператор await используется для ожидания завершения кода вызванного метода. Коды других методов, обработчиков сообщений, могут работать асинхронно.
Это противоречит? Уточняет? Добавляет эмоции?
Зачем ты это написал?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684678
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRесли вызов async-метода производится не из UI-потока,это когда нибудь требуется? Или это чисто абстрактно?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684685
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Prokealon(Ruslan)ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключениеConfigureAwait(false) разрешает выполнять продолжение в том же потоке, но меня пока интересует обратная ситуация...именно что в любом
Код: plaintext
true to attempt to marshal the continuation back to the original context captured; otherwise, false.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684701
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRОткуда такое заблуждение? Вся та статья как раз и посвящена доказательству того что это не так (что контекст синхронизации не переходит через await, а значит, если вызов async-метода производится не из UI-потока, то и продолжение не будет выполнятся в UI-потоке, что бы там в ConfigureAwait не задавалось).

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684704
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009]
>...Зачем ты это написал?
<Я так думаю.
UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684708
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009]
>...Зачем ты это написал?
<Я так думаю.
UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684709
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684713
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё есть такой трюк

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
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"); 
    // ...
}



(источник)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684727
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЗачем ему переходить? И почему заблуждение? Сейчас покажу.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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.
Весьма странный довод.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684728
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДа, глубина вложенности не имеет значения, так как компилятор строит конечный автомат.
Ну примерно, да :)То есть, если я напишу грубо говоря
Код: c#
1.
2.
await Task.Delay(1);
Text1.Text="UI";

это будет работать, из какого бы метода это не было вызвано?
hVosttЭто нужно делать только в библиотеках, которые однозначно не взаимодействуют с UI и которым не требуется контекст синхронизации.Ну если это код хелпера, например, внутри проекта, который не взаимодействует с UI, зачем мне его выполнять в UI?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684729
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕщё есть такой трюк

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
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?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684742
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009]
>...Зачем ты это написал?
<Я так думаю.
UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.
Не нужно додумывать за MS.
У МS термин ожидание это не form.ShowModal; из дельфи прошлого века.
Где код ГУИ встал на этой строчке.
Ожидание потока имеется ввиду.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684877
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНу если это код хелпера, например, внутри проекта, который не взаимодействует с UI, зачем мне его выполнять в UI?

Ну может это хелпер, который может обновлять ProgressBar. Или ещё что-то делать. Серьёзные приложения имеют сложность, которая не укладывается код обработчиков событий. Код слишком большой, чтобы размещать его там, если интенсивно используются асинхронные операции. Ну и MVP/MVVM никто не отменял :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684878
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТо есть, если я напишу грубо говоря
Код: c#
1.
2.
await Task.Delay(1);
Text1.Text="UI";


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

Если в цепочке вызовов везде будет await, да.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684880
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсли в цепочке вызовов везде будет await, да.А какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684908
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttЕсли в цепочке вызовов везде будет await, да.А какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?

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

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

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

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
await Some1(...)
   ...
   await Some2(...)
      ...
      await Some3(...)
         ...
         await Some4(...)
         ...
      ...
   ...



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

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            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 это не ошибка :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684919
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЧета я не допираю.
INotifyCompletion
Нафига у ThreadPoolRedirector другие члены окромя OnCompleted?

Для await нужен объект с методом GetAwaiter
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684920
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?

По поводу вопроса, ещё раз. Если ты вызовешь Wait или Result на таске вместо await, а внутри будет await без ConfigureAwait(false) будет гарантированный дедлок.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684939
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Petro123, сегодня, 12:14 [21634132]

>...Где код ГУИ встал на этой строчке…
<Стоит как миленький, и обработчики работают, и прогресс бар показывает:
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();
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684961
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВЧета я не допираю.
INotifyCompletion
Нафига у ThreadPoolRedirector другие члены окромя OnCompleted?

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

"Используйте механизм, о котором в документации явно сказано, что это инфраструктура и нефик юзать в прикладном коде (как минимум могут изменить механизм), при чем эта инфраструктура юзает утиную типизацию. А само "решение" гарантированно подменяет пул потоков созданный специально для тасков, на пул ThreadPool существующий со времен царя Гороха."
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684962
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

В сложных прогах лучше не пользоваться асинк авейт думаю - фиг концов найдешь потом
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684963
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
Открой наконец для себя возможности форматирования кода!
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684987
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВТ. е. для решение проблемы, о которой можно сказать, хз, есть она или нет, скорее всего нет, если механизмом async/await пользоваться только там, где он предназначен используется следующее решение -

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

Ну в целом, знать как это устроено внутри полезно, но для использования нужно абстрагироваться. Нужно было бы. Если бы C# изначально проектировался с async/await, возможно получился бы простой и лёгкий синтаксис, как в Go.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684991
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

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

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

Из плюсов:

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

Из минусов:

1. Дофига await.
2. Дофига ConfigureAwait(false) -- помогают расширения решарпера и рослин, можно автоматизировать процесс.
3. В некоторых случаях, функциональный подход (аля промисы) -- лучше, для этого приходится оборачивать async/await (дожили).
4. Все минусы меркнут перед сложностью отладки. Нет, IDE не встанет заботливо на точку по месту ошибки. Те, кто привыкли так работать страдают и воют как кони. Но если изначально отказываться от разработки через отладку, проблем нет.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685000
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМы проект написали полностью async-first.

Из плюсов:

1. Асинхронный вызов можно встроить в любой точке на любой глубине кода.
Чет ты перегнул.
Как вставить по стеку в глубине, если async не поддерживает стек?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685001
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Чет ты перегнул.
Как вставить по стеку в глубине, если async не поддерживает стек?

ну заведомо синхронные методы -- синхронные, без фанатизма, их намного больше.
но все сервисы, службы, шины, менеджеры, и прочее -- асинхронные.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685006
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Ну, понятно. async First это просто "делайте чаще чтобы гуи не морозило))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685013
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну в целом, знать как это устроено внутри полезно, но для использования нужно абстрагироваться. Нужно было бы. Если бы C# изначально проектировался с async/await, возможно получился бы простой и лёгкий синтаксис, как в Go.
А что в GO такого легкого и простого?
Ужасные горутины и каналы?
Просто мерзкая обработка ошибок?
И никакого ГУЯ!
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685017
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВА что в GO такого легкого и простого?
Ужасные горутины и каналы?
Просто мерзкая обработка ошибок?
И никакого ГУЯ!

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

кстати, в .NET тоже будут каналы, скоро.
пока в глубокой бете.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685021
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttбудут каналы, скоро.вот я не понимаю почему сабж со стеком не работает?
Код: c#
1.
2.
3.
4.
5.
6.
Bool Metod1{
   if (Metod2(contextDb)) {
       CreateMap();
       CopyMap();
       return true;
   }


Вот как вставить асинхронный метод в метод2?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685029
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вот я не понимаю почему сабж со стеком не работает?

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


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

сделать Metod2 асинхронным _)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685030
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
почему ужасные? сравнивать напрямую нельзя конечно, так как другая парадигма.

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

hVosttкстати, в .NET тоже будут каналы, скоро.
пока в глубокой бете.
Про каналы ничего не имею против, особенно когда они допускают межпроцессорное и межкомпьютерное взаимодействие.
В .NET они уже были 9 лет назад.
Axum
Введение в язык программирования Axum
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685035
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttсделать Metod2 асинхронным _)как сделать без замены возврата bool?
Этод метод вызывается в куче мест.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685036
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttчто ты имеешь в виду?CreateMap() будет вызвана до окончания потока внутри метода2.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685039
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Petro123, сегодня, 18:38 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634863][21634878]
>...Нет, IDE не встанет заботливо на точку по месту ошибки. Те, кто привыкли так работать страдают и воют…
<Что-то не понимаю:
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685046
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВУжасные - это касалось горутин. Обычный запуск задачи в отдельном потоке.

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


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

https://www.nuget.org/packages/System.Threading.Channels :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685047
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123как сделать без замены возврата bool?
Этод метод вызывается в куче мест.

никак, либо две версии метода
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685048
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев<Что-то не понимаю:

Код на скрне полностью синхронный.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685059
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 20:31 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634947][21634947]

>Код на скрне полностью синхронный.
<А так:
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685063
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

И чего? Вы точку останова поставили.
Речь идёт о сваливании с исключением и остановкой дебагера на этом месте.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685139
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПо поводу вопроса, ещё раз. Если ты вызовешь Wait или Result на таске вместо await, а внутри будет await без ConfigureAwait(false) будет гарантированный дедлок.По поводу вложенности еще раз. Если await без ConfigureAwait(false) на первом уровне - то дедлок понятен, а если, к примеру, первый-второй уровень вложенности идет с ConfigureAwait(false), а на третьем забыли. Будет ли дедлок и если да, то почему?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685270
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПо поводу вложенности еще раз. Если await без ConfigureAwait(false) на первом уровне - то дедлок понятен, а если, к примеру, первый-второй уровень вложенности идет с ConfigureAwait(false), а на третьем забыли. Будет ли дедлок и если да, то почему?

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        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";
        }



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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        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";
        }
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685272
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

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

Для кода, выполняемого после ConfigureAwait контекст потерян, и там уже не имеет значения, есть ConfigureAwait или нет.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685321
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНеобходимо понимать, что ConfigureAwait на сам вызов метода не влияет, только на продолжение.это я понимаю. Я не понимаю какой-то другой нюанс в твоем изначальном примере и пытаюсь его нащупать...

Я, похоже, вот какой момент не до конца осознавал... при вызове асинхронного метода (в том числе каскадно) его (их) операторы будут выполняться в вызвавшем потоке до первого встреченного await-а. Я воспринимал, что операторы сразу начнут выполняться в другом потоке. И, кажется, я это знал, но забыл )) Отсюда все мои предыдущие вопросы можно аннулировать
Спасибо.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685323
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСейчас проекты пишутся async-first. Всё хорошо.При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685353
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример, где ConfigureAwait(false) не спасает от дедлока, это только у меня так? (WinForms, VS2017, FW 4.5.2-4.6.2)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Text = FindAsync("http://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-поток.
Или все происходит как-то по другому? Может кто-нибудь проверить этот пример у себя?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685379
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttСейчас проекты пишутся async-first. Всё хорошо.При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?забить студия не даст.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685391
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123забить студия не даст.С чего вдруг не даст? Даже решарпер - и тот не настаивает.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685501
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ, похоже, вот какой момент не до конца осознавал... при вызове асинхронного метода (в том числе каскадно) его (их) операторы будут выполняться в вызвавшем потоке до первого встреченного await-а. Я воспринимал, что операторы сразу начнут выполняться в другом потоке. И, кажется, я это знал, но забыл )) Отсюда все мои предыдущие вопросы можно аннулировать

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

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

Нет, не забили. Все асинхронные методы имеют суффикс Async. Контролируется на этапе сборки.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685502
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProPetro123забить студия не даст.С чего вдруг не даст? Даже решарпер - и тот не настаивает.
хм... Проверил, ты прав. Убрал суффикс и не ругается.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685504
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКонтролируется на этапе сборки.тоже помню где то ругалась.
Счас проверил - f2, переименовать - не ругается)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685505
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRConfigureAwait(false) лишь отменяет требование выполнять продолжение в первоначальном контексте, т.е., дает "добро" на любой контекст, в т.ч. не исключая первоначальный. В данном примере, вероятно, async-инфраструктуре "влом" идти и брать свободный поток из пула, и выбирается то, что "под боком" - а это (уже блокированный ожиданием .Result) UI-поток.
Или все происходит как-то по другому? Может кто-нибудь проверить этот пример у себя?

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

Меняем на HttpClient и проблема исчезает.
Вообще, от WebCliet надо уже дааааааавным давно уже было отказаться везде где только можно.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685506
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНет, не забили. Все асинхронные методы имеют суффикс Async.И даже методы контроллера?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685508
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttНет, не забили. Все асинхронные методы имеют суффикс Async.И даже методы контроллера?

Нет, это исключение из правила :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685543
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt https://stackoverflow.com/questions/18524609/configureawaitfalse-still-deadlocks

Меняем на HttpClient и проблема исчезает.
Вообще, от WebCliet надо уже дааааааавным давно уже было отказаться везде где только можно.
Ага, понятно, спасибо! Получается, что панацеи от дедлока при синхронном вызове "какого либо" асинхронного метода не существует... Переделывать синхронные методы в асинхронные, чтобы безопасно вызывать "любые" асинхронные, тоже не всегда возможно (out-параметры и т.п.). В общем, асинхронность "кусается"))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685554
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRАга, понятно, спасибо! Получается, что панацеи от дедлока при синхронном вызове "какого либо" асинхронного метода не существует... Переделывать синхронные методы в асинхронные, чтобы безопасно вызывать "любые" асинхронные, тоже не всегда возможно (out-параметры и т.п.). В общем, асинхронность "кусается"))

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

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

http://andrey.moveax.ru/post/csharp-sync-to-async
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685580
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПочему? Можно, но делать надо это правильно :)

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

http://andrey.moveax.ru/post/csharp-sync-to-async
Пример хороший, но несколько о другом.
Речь о том, как безопасно вызывать "какой либо" асинхронный метод. Из async-метода это сделать легко - используя await. Из синхронного - сложнее, зависит от... Но, например, как в примере с дедлоком, этот синхронный метод (обработчик нажатия кнопки) легко превратить в асинхронный (дописать async) - и в нем задействовать await. Но такое легкое "превращение" не всегда возможно, в частности, если у метода есть out-параметры.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685637
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 в библиотеках, традиционно
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685638
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRесли у метода есть out-параметры

Запаковывать в OperationResult, как уже обсуждалось тут ранее ))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685649
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttLRесли у метода есть out-параметры

Запаковывать в OperationResult, как уже обсуждалось тут ранее ))
Не надо делать синхронный код асинхронным автоматически или волшебством дописав async.
Если у вас out или у меня стек вызовов до 5го колена, то ничего не выйдет.
Логику и методы надо будет переписать.
Не заворачивая out в result, а полностью избавится от них.
Как в java).
Асинхронный код и сам программист не равен синхронному)).
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685662
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Не надо делать синхронный код асинхронным автоматически или волшебством дописав async.

Обычно это нужно, когда асинхронные интерфейсы и синхронный код, который надо подсунуть через адаптер.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685674
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttОбычно это нужно, когда асинхронные интерфейсы и синхронный код, который надо подсунуть через адаптер.сложно понять постановку в одно предложение.
Но вероятно что все методы уже готовы для асинхрооности)).
Out,ref нету. Общения с ГУИ нету. Они без вложенности и слабозависимы от результатов..
Тогда можно и async first). Это твой термин?
У меня в десктопе, кстати, не так много мест где нужна асинхронность.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685884
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Всё, что потенциально работает с данными, асинхронное. Также, запросы API, работа с файлами, тоже асинхронное. В десткопе это тоже имеет смысл, но десктоп не сильно страдает от использования потоков для получения асинхронного поведения. Хотя зависит от объёма функционала и нагрузки.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685894
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Вот смотри.
Есть же другие способы в IT добится цели.
В веб это контейнер или конвейер запросов. На каждый запрос конейнер выделяет новый поток.
В десктопе есть ОРМ, кэш, СУБД которые делают время отклика 0,1 сек.
Поэтому асинхронность методом await нужна там где нужна и в строке где поставил программист.
Согласись, что бездумно пихать асинхронность например на чтение конфига нафиг нужно.
Профи используют к месту и с умом). На то они и профи.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685896
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Поэтому я не поддерживаю сабж чтобы убрать оператор) и асинхронность first.
Imho.
Удачи!
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685898
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Согласись, что бездумно пихать асинхронность например на чтение конфига нафиг нужно.

Если программа не может стартануть без конфига, то синхронное чтение абсолютно уместно. В ином случае, асинхронный доступ лучше, так как IO операции не детерменированы по времени.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685993
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсли программа не может стартануть без конфига, то синхронное чтение абсолютно уместноне понял как первое со вторым связано.
Первое решается тремя способами:
- конфиг это project - properties - settings
- руками.....после InitializeComponent() создать если надо default конфиг
- в коде учитывай что его нет.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685998
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttасинхронный доступ лучше, так как IO операции не детерменированы по времени.
Ты по проще для народа выражайся).
Я выше писал, то профи держит под контролем IO операции.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689053
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttДумаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно.

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

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

await это синтаксический сахар, тригерящий компилятор на создание стейт-машины.
Вы предлагаете его убрать, чтобы компилятор автоматически распознавал, что метод возвращает Task, и в этом случае создавал стейт-машину ? Но как тогда быть, если мы хотим использовать не await а простой wait - например в консольном приложении ?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689059
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttЕвгенийВА что в GO такого легкого и простого?
Ужасные горутины и каналы?
Просто мерзкая обработка ошибок?
И никакого ГУЯ!

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

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

точнее даже не в бете а в альфе вообще 0.1.0-alpha-001 :)
https://www.nuget.org/packages/System.Threading.Tasks.Channels
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689081
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,
В консольном не надо асинхронность (шутка)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689096
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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/

или я сейчас ошибаюсь.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689100
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreДумаю есть какие-то ситуации, когда осмысленно не задействовать async/await.я тоже против "автомата" в данном случае.
Если бы все поддержали то и 10 страниц бы не было.
Мне лично хотя бы для читабельности кода нужен оператор.
Imho
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689107
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто у автора темы много работы связанной с асинхронным выполнением :) у многих таких проблем нет.
Это как с пропами, когда много работаешь с UI и моделями, немного раздражает эта писанина, даже с учётом сниппетов. всегда есть вещи, которые хотелось бы сделать проще. Сахара мало не бывает. Но нужно относиться к этому проще, лет 10 назад, всё это было куда большим гемороем
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689113
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreawait это синтаксический сахар, тригерящий компилятор на создание стейт-машины.
Вы предлагаете его убрать, чтобы компилятор автоматически распознавал, что метод возвращает Task, и в этом случае создавал стейт-машину ? Но как тогда быть, если мы хотим использовать не await а простой wait - например в консольном приложении ?

Легко. Метод помечен ключевым словом async. Этого достаточно в абсолютном большинстве случаев. И зачем в асинхронном заведомо методе "простой wait"?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689117
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЧто предложение отказаться от старого TPL и сделать все методы с Task'ами вызываемыми с await по умолчанию, не очень наверное правильная.

Я не совсем понял, как TPL кореллирует с TAP? Это немного разные вещи :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39689304
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

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

В общем. действительно, раз тема растянулась на 11 страниц, то значит либо мы тут чего-то не понимаем - но понимают microsoft'овцы - и не можем дать четкого ответа который бы сразу закрыл всё обсуждение. Либо действительно все оставлено "чтобы было" - мол кто хочет пользуется, кто не хочет не пользуется.
...
Рейтинг: 0 / 0
252 сообщений из 252, показаны все 11 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зачем нужен await?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]