powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зачем нужен await?
25 сообщений из 252, страница 1 из 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
25 сообщений из 252, страница 1 из 11
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зачем нужен await?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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