|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Думаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно. Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно? Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2018, 22:50 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttДумаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно. Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно? Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис. Тебе вообще зачем __асинхронный__ вызов нужен? Наверное, чтобы он выполнялся параллельно с остальным кодом... А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 00:05 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
MasterZivТебе вообще зачем __асинхронный__ вызов нужен? Наверное, чтобы он выполнялся параллельно с остальным кодом... А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова? Похоже, вы очень сильно путаете понятия. Вот вам ссылка почитать Вкратце, асинхронный вызов мне нужен, чтобы I/O операции не блокировали рабочий поток из пула. Запуск подобного ожидания в параллельном потоке, это костыль, не решающий проблемы, но позволяющий, например, не блокировать единственный UI поток. В контексте серверных веб-приложений, подобный финт ушами вообще бесмысленнен. А в контексте, например, JavaScript и вовсе невозможен (не будем брать в расчёт не так давно появившиеся Web Workers). В общем, вернёмся к вопросу. Уточню, откуда ноги растут у вопроса. Проблемы две: 1. избыточность повсеместного ключевого слова await, если есть какое-то подозрение, что код модуля будет исполнять асинхронные методы, он тоже должен быть асинхронным. 2. забыли await, получили проблемы, особенно, если мы не ожидаем результат, а только сам факт асинхронного исполнения (async void). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 00:27 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 01:51 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Тогда после введения этой особенности получилось бы нарушение обратной совместимости. До нее тот же самый код бы просто запускал метод. А после нее эвейтил бы таску. Причем в документации бы пришлось писать что var x = y() ведёт себя по разному для методов возвращающих такску и прочие типы ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 06:17 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LR Код: c# 1. 2. 3. 4. 5. 6.
Это очень странный код, поясните, зачем вы используете здесь ContinueWith вместе с await? Код: c# 1. 2. 3.
По поводу второго "не нужно". Это распространённая ошибка. Если приложение нормально завершит свою работу раньше, чем ваш Task, то работа может быть прервана на середине и код в ContinueWith вообще не выполнится. И без await контекст синхронизации нужно передавать вручную (актуально для UI и для ASP.NET, но не Core). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 08:35 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
WebSharperТогда после введения этой особенности получилось бы нарушение обратной совместимости. До нее тот же самый код бы просто запускал метод. А после нее эвейтил бы таску. Т.е. кроме обратной совместимости, других проблем вы не видите? Думаете, если бы язык проектировался заново, типа новая супер-мажорная версия, без обратной совместимости, от ключевого слова await могли бы отказаться? WebSharperПричем в документации бы пришлось писать что var x = y() ведёт себя по разному для методов возвращающих такску и прочие типы Если бы async был частью контракта, а не реализации, то компилятор бы скрывал таску, y() при этом возвращал результат функции, а не awaitable объект в контексте использования. Проблема в том, что возвращаемый результат типа Task ещё не говорит о том, что это асинхронный метод. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 08:41 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
MasterZivhVosttДумаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно. Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно? Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис. Тебе вообще зачем __асинхронный__ вызов нужен? Наверное, чтобы он выполнялся параллельно с остальным кодом... А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова? +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 09:27 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttПо поводу второго "не нужно". Это распространённая ошибка. Если приложение нормально завершит свою работу раньше, чем ваш Task, то работа может быть прервана на середине и код в ContinueWith вообще не выполнится. И без await контекст синхронизации нужно передавать вручную (актуально для UI и для ASP.NET, но не Core). Это не ошибка, так задумано, если задание не выполнится до окончания работы приложения - это нормально, иначе задумано с sometask. Повторю, ситуации могут быть разными, await дает еще одну степень свободы - и это хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 09:28 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttВопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно? как вы правильно после заметили это не контракт, а реализация. контрактом является возврат интерфейса в котором есть управление задачей и получение результата. Т.е. компилятор не может вызвать метод асинхронно, await - синтаксический сахар, он просто вызывает методы ожидания возвращаемого интерфейса и попутно трасирует в него часть своей реализации. Принципиальной проблемы в использовании await вне асинхронного метода нет, собственнно в плюсах так можно делать без проблем. hVosttПонятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис. а как тогда должен себя вести код генерируемый компилятором? всегда ждать завершения? тогда 21619662 вполне уместен запоминать что переменная не переменная и её нужно проверять? тогда встаёт вопрос эффективности, фактически придётся делать ленивый вызов при использовании переменной, следить за ней, что в массовом порядке накладно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 10:01 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttТ.е. кроме обратной совместимости, других проблем вы не видите? Думаете, если бы язык проектировался заново, типа новая супер-мажорная версия, без обратной совместимости, от ключевого слова await могли бы отказаться? При этом можно было бы ввести другое умолчание (соответственно для поведения когда мы продолжаем исполнение, а не возвращаем управление вызвавшему методу). Т.е. у нас есть 3 действия - получить таску и что-то с ней сделать. Вернуть управление вызвавшему методу. Подождать пока вызванный метод закончится. Нам их надо как-то разграничить. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 12:49 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRЭто не ошибка, так задумано, если задание не выполнится до окончания работы приложения - это нормально, иначе задумано с sometask. Повторю, ситуации могут быть разными, await дает еще одну степень свободы - и это хорошо. Спорить не буду. Лично я считаю, что запуск задач по принципу fire and forget должен осуществляться через планировщик заданий, и нормальное завершение программы не должно осуществляться путём terminate запущенных потоков. Либо нужно дожидаться выполнения всех заданий, либо посылать сигнал с требованием немедленного завершения работ, как минимум через CancellationToken, если мы говорим про C#. Так что это выглядит как ошибка и никак иначе. LRПовторю, ситуации могут быть разными, await дает еще одну степень свободы - и это хорошо. Проблема в том, что "ещё одна степень свободы" выливается в описанные выше мною проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 12:53 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)как вы правильно после заметили это не контракт, а реализация. контрактом является возврат интерфейса в котором есть управление задачей и получение результата. Т.е. компилятор не может вызвать метод асинхронно, await - синтаксический сахар, он просто вызывает методы ожидания возвращаемого интерфейса и попутно трасирует в него часть своей реализации. Если мы говорим про C#, это довольно смелое утверждение насчёт "просто вызывает методы ожидания". Я спорил с Джоном Скитом на тему является ли await синтаксическим сахаром, и он меня убедил, что да, является. Но await принуждает компилятор строить конечный автомат без накладных расходов на количество кода в продолжении. А также разбирается с исключениями и контекстом синхронизации. В JavaScript да, это сахар, превращающийся в промисы. Конечно, из-за отсутствия контракта, компилятор не может сам сделать await , значит при его наличии, это можно было сделать, так? kealon(Ruslan)а как тогда должен себя вести код генерируемый компилятором? Он должен увидеть вызов асинхронного метода и выполнить его асинхронно, и не позволять дёргать асинхронные методы за пределами асинхронного контекста (асинхронного метода). kealon(Ruslan)всегда ждать завершения? тогда 21619662 вполне уместен Я не понимаю, почему до сих пор много людей путают конкурентность и асинхронность. Нет, не уместен. Давайте напомню, в JavaScript нельзя выполнить код параллельно. Можно выполнить ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 13:00 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
.. можно выполнить код асинхронно. kealon(Ruslan)запоминать что переменная не переменная и её нужно проверять? тогда встаёт вопрос эффективности, фактически придётся делать ленивый вызов при использовании переменной, следить за ней, что в массовом порядке накладно. При наличии контракта, видим, что метод асинхронный, значит выполняем его асинхронно. Т.е. компилятор сам вставляет await там, где он итак должен был быть написан программистом. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 13:09 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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, это является проблемой. но и она решается точно также, как решаются все остальные проблемы отсутствия типизации. в общем, пока только обратная совместимость выглядит как преграда. ну ещё несколько лет нужно, чтобы люди привыкли к парадигме. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 13:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, давайте в реализации шарпа, и плавно к нативу в плюсах из которого видно куда что прыгает любой асинхронный метод в шарпе возвращает контракт IASync<T> на получение значения далее с ним надо что-то делать собственно await это такой сахар который одновременно ждёт вычисления IASync<T> и мониторит не отменили ли головной метод и если отменили "трубит" полученному контракту "СТОП" тут надеюсь всё понятно как это всё выглядит изнутри плюсов: вызвали аснхронный метод, собственно он возвращает контракт IASync<T> и тут можно с ним делать что угодно: подождать вызвать другой метод и пр. как это может быть в плане реализации асинхронного метода: тут куча вариантов: асинхронная функция ОС, запуск обёрнутой задачи в пул и пр. пр. теперь: hVosttНо await принуждает компилятор строить конечный автомат без накладных расходов на количество кода в продолжении. А также разбирается с исключениями и контекстом синхронизации.ничего он не выдумывает, он просто вставляет код ожидания hVosttКонечно, из-за отсутствия контракта, компилятор не может сам сделать await , значит при его наличии, это можно было сделать, так?у него только контракт (IASync<T>) и есть, он и вызывает один из его методов, на саму реализацию он не влияет hVosttkealon(Ruslan)а как тогда должен себя вести код генерируемый компилятором? Он должен увидеть вызов асинхронного метода и выполнить его асинхронно, и не позволять дёргать асинхронные методы за пределами асинхронного контекста (асинхронного метода). kealon(Ruslan)всегда ждать завершения? тогда 21619662 вполне уместен Я не понимаю, почему до сих пор много людей путают конкурентность и асинхронность. Нет, не уместен. ему вообще по барабану, у компилятора только контракт на ожидание выполнения непонятно чего Код: c# 1. 2.
куда физически вставлять await? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 13:29 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt.. можно выполнить код асинхронно. kealon(Ruslan)запоминать что переменная не переменная и её нужно проверять? тогда встаёт вопрос эффективности, фактически придётся делать ленивый вызов при использовании переменной, следить за ней, что в массовом порядке накладно. При наличии контракта, видим, что метод асинхронный, значит выполняем его асинхронно. Т.е. компилятор сам вставляет await там, где он итак должен был быть написан программистом.ещё раз повторю: "асинхронный метод в реализации шарпа значит, что возвращается контракт на получение значения" т.е. в нативе это какой-то стаб который, например, кидает задачу в пул на выполнение своего кода и возвращает интерфейс по ожиданию его завершения\отмены\получению результата и пр. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 13:42 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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.
куда физически вставлять await? Вот сюда. И только при условии, что метод, в котором находится этот код помечен как async. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 14:28 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)т.е. в нативе это какой-то стаб который, например, кидает задачу в пул на выполнение своего кода и возвращает интерфейс по ожиданию его завершения\отмены\получению результата и пр. Т.е. будете ждать выполнение i/o операций на выделенном пуле потоков? Мдя... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 14:30 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttВопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно? Если я правильно понял, то ты хотел предложить не использовать await ? Но тогда как компилятор поймёт, до какого момента ему ждать ? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 14:34 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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.
Первый случай это запуск таски в отдельном потоке, последующий await приводит только к асинхронному ожиданию (о чём было сказано 21619662 ), а не асинхронному выполнению. Во втором случае, функция помечена async , значит вызов любой асинхронной функции должен быть асинхронным, если это не указано каким-то определённым образом иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 14:50 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 14:52 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttkealon(Ruslan)как это всё выглядит изнутри плюсов: вызвали аснхронный метод, собственно он возвращает контракт IASync<T> и тут можно с ним делать что угодно: подождать вызвать другой метод и пр. как это может быть в плане реализации асинхронного метода: тут куча вариантов: асинхронная функция ОС, запуск обёрнутой задачи в пул и пр. пр. Из плюсов, да и в C# тоже, весь код, который генерит await можно написать и самостоятельно. Чудеса начинаются, когда среди кучи последовательных и вложенных await доходим до функций, выполняющих непосредственно I/O операции, которые и "отпускают" поток восвоясь. А когда результат будет получен, будет выдернут любой свободный поток, который продолжит выполнение оставшегося кода. Вот здесь суть, которую многие упускают, когда пытаются "на пальцах" строить свои объяснения того, как это устроено. Это и правда выглядит так, как будто оставшийся кусок метода после await тупо завернули в коллбек. Но это наивно так полагать.не выдумывайте, там обычный линейный код hVosttkealon(Ruslan)пропущено... ничего он не выдумывает, он просто вставляет код ожидания Куда вставляет? Кто код ожидания будет выполнять? Что там со стеком? Могу ли я ожидать огромное количество асинхронных операций, с небольшим количеством рабочих потоков?ожидание выполняет реализатор контракта IAsync<T> в частности с IO, для этого достаточно текущую нить отдать "планировщику" и переключиться на выполнение другой задачи. Можете ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 14:57 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, Для меня как раз наоборот - первый случай абсолютно очевиден, а второй - наоборот. Не понятно, что должна сделать эта процедура выполняя первый и второй оператор. И в каком потоке. Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 15:02 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)не выдумывайте, там обычный линейный код Да, там код. Это правда kealon(Ruslan)ожидание выполняет реализатор контракта IAsync<T> в частности с IO, для этого достаточно текущую нить отдать "планировщику" и переключиться на выполнение другой задачи. Вы не хотите разбираться как работает паттерн async/await, вообразили себе как он работает примитивным образом, окей. Спорить не буду, топик не об этом. Мне-то что хотите доказать? Я вопрос и проблемы в начале топика озвучил. Они не критичные, но с ними пришлось столкнуться. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 15:07 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Valery_BДля меня как раз наоборот - первый случай абсолютно очевиден, а второй - наоборот. Не понятно, что должна сделать эта процедура выполняя первый и второй оператор. И в каком потоке. Код: c# 1. 2. 3. 4. 5. 6. 7.
Это потому что вам это ещё пока не привычно. Посмотрите, что случилось, когда в Java ввели var , сколько воя и боли. Очевидно, что это упрощает написание и облегчает код, но некоторые сразу сказали, что им непонятно теперь какого типа переменные, var всё портит Здесь ситуация такая же. Мне достаточно, если асинхронные методы будут иметь суффикс Async, ну и IDE мог бы с лёгкостью подсвечивать асинхронные вызовы. Просто этого нет пока, надо вручную писать много await и это печалит. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 15:11 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttМне-то что хотите доказать? Я вопрос и проблемы в начале топика озвучил. Они не критичные, но с ними пришлось столкнуться.вы совершенно не понимаете как это работает, хуже того - вы себе что-то насочиняли исходя из второго у вас и весь вопрос на дуболомный вопрос MasterZiv-а у вас нет ответа а конкретно если у вас везде await, то что-то с вашим кодом не так по вашему Код: c# 1. 2.
должен преобразоваться в Код: c# 1. 2.
ну-ну... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 15:46 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)по вашему Код: c# 1. 2.
должен преобразоваться в Код: c# 1. 2.
ну-ну... Если эти вызовы производятся из async-метода, то да, хотя бы один из этих двух вызовов должен быть с await, иначе сам метод будет выполняться синхронно (и это вполне логично). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:02 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, че то ты где то не понял :( async await {censored} не нужны Модератор: Просьба подбирать слова покультурнее ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:05 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:12 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:13 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)на дуболомный вопрос MasterZiv-а у вас нет ответа Если вы не разбираетесь в вопросе вместе с MasterZiv, в этом ничего плохого нет, не нужно вступать в полемику. kealon(Ruslan)а конкретно если у вас везде await, то что-то с вашим кодом не так по вашему Код: c# 1. 2.
должен преобразоваться в Код: c# 1. 2.
Мда. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:19 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRoshVostt, че то ты где то не понял :( async await {censored} не нужны В контексте твоих проектов, не особо нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:20 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеев<На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так: Код: c# 1. 2. 3. 4. 5.
Но это не асинхронный вызов. Это асинхронное ожидание, в этом случае блокируется отдельно выделенный поток для абсолютно синхронного выполнения i/o операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:22 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеев<На первый взгляд неплохо - меньше писанины. Но мне приходится писать и так: Код: c# 1. 2. 3. 4. 5.
Компилятор мог бы для всех task-ов "докинуть" await, это не проблема... Проблема, если разработчику понадобиться более гибкая схема, например async ... Method() { task1.Start(); task2.Start(); await task1; } и где-то в другом месте task2.Wait(); ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:39 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRЕсли эти вызовы производятся из async-метода, то да, хотя бы один из этих двух вызовов должен быть с await, иначе сам метод будет выполняться синхронно (и это вполне логично).нет (то что выдаются красивые варнинги - они не по этому поводу и ничего не меняют), просто потеряешь контроль над выполнением и без дополнительных танцев не узнаешь когда в действительности выполнятся оба метода. просто проверить не судьба я так понимаю ... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 16:53 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 17:08 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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.
Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 17:15 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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. эта фраза никак не противоречит моим словам, просто понимаешь ты её неправильно ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 17:17 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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.
kealon(Ruslan)эта фраза никак не противоречит моим словам, просто понимаешь ты её неправильно Да уж, вижу))) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 17:45 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRАсинхронный метод здесь нужен лишь в одном месте А, возможно, и не нужен вовсе... Смысл async-метода во фразе из приведенной цитаты: "When the task completes, it invokes its continuation, and execution of the async method resumes where it left off." Если никакого продолжения нет, или продолжение не использует результаты task-ов, то какой смысл городить async-метод? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 17:58 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>hVostt, сегодня, 16:22 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21621776] [21621776] >Но это не асинхронный вызов. Это асинхронное ожидание,... <Называйте как хотите, но вторя Вам - асинхронный вызов мне нужен, чтобы I/O операции не блокировали UI поток. Иногда асинхронные операции с базой данных только называются асинхронными (суффикс Async присутствует), на самом деле метод выполняется синхронно. Используемая конструкция реализует асинхронность(параллельность) выполнения I/O. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 18:07 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LR, <я не знаю как ставится смайл когда по лбу себя бьёшь> ноLRЕсли никакого продолжения нет, или продолжение не использует результаты task-ов, то какой смысл городить async-метод? направление мыслей уже правильное глядишь уже сможешь понять 21619662 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 18:32 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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... и думаем...думаем...думаем... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 19:28 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRМдя)) Почитать документацию и узнать что такое async-методы не судьба, я так понимаю...\ Судя по наивным и глупым мессаджам kealon(Ruslan) , это вообще тёмный лес. Я понимаю, даже не удосужился почитать, не имел дела, да и понятия не имеет о чём идёт речь, но своё однозначное мнение имеет ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 19:31 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)глядишь уже сможешь понять 21619662 Там слишком глубокий вопрос. В C# все прозаически банально: async/await надо для отзывчивости гуя. Чтобы клик по кнопке не завесил прогу. По встрече await дальнейший код уходит в другой поток, освобождается поток обработки сообщений, тот принимает следующее сообщение виндовса и т.д. Плюсом await дает написать хорошо читаемый код, т.е. синтаксический сахар в чистом виде. В остальном от async/await пользы не много. Я консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync(). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 19:35 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеевНазывайте как хотите, но вторя Вам - асинхронный вызов мне нужен, чтобы I/O операции не блокировали UI поток. Это можно сделать и без await. Это делали 10 лет назад в тех же винформсах. Поэтому это за рамками топика. ВМоисеевИспользуемая конструкция реализует асинхронность(параллельность) выполнения I/O. Нет, I/O здесь выполняется синхронно, в синхронном коде. Вы просто реализуете асинхронное ожидание результата. Но если так нравится, используйте ради бога, но это немного за рамками топике. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 19:36 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)направление мыслей уже правильное глядишь уже сможешь понять 21619662 Вот эти глупости может прекратите копипастить? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 19:36 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Dima TТам слишком глубокий вопрос. В C# все прозаически банально: async/await надо для отзывчивости гуя. Чтобы клик по кнопке не завесил прогу. По встрече await дальнейший код уходит в другой поток, освобождается поток обработки сообщений, тот принимает следующее сообщение виндовса и т.д. Плюсом await дает написать хорошо читаемый код, т.е. синтаксический сахар в чистом виде. В остальном от async/await пользы не много. Я консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync(). У вас что, патологическая неприязнь к литературе, к справочным материалам? Вы хотя бы почитайте на оф. сайте, я уж не говорю о какой-либо практике. Прозаически банально это в вашем воображении. Нет, async/await нужен вовсе не только для отзывчивости гуя, это прекрасно решали ещё 10 лет назад, существует как минимум 2 асинхронных API, до появления TAP. Но я сомневаюсь, что вы о них вообще слышали. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 19:39 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Dima TЯ консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync(). Ну ясно. Если практика этим заканчивается, async/await вообще здесь не к месту. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 19:43 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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... и думаем...думаем...думаем... Это бессмысленно. Если человек себе что-то в голову вбил, и забил на документацию, это бессмысленно. Я честно говоря, вообще в глубоком шоке. Не думал, что придётся столкнуться с подобным невежеством. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 19:45 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttсуществует как минимум 2 асинхронных API, до появления TAP. Но я сомневаюсь, что вы о них вообще слышали. Слышал, т.е. читал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:00 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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 что бы всё встало на свои места а уж потом изучать патерны ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:01 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Топик ушел в сторону обсуждения реализации async/await в .net, как оно на других ЯП никто не пишет, поэтому топик переезжает в профильный форум. Модератор: Тема перенесена из форума "Программирование". ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:04 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)банальная фраза, она говорит что когда твоя задача занята ожиданием в await, нет никаких гарантий что она блокирует исполняющий её поток и он не может в это время заниматься какими-то другими делами судя по формулировке "занята ожиданием" пока дошло не до конца :) kealon(Ruslan)достаточно посмотреть в отладчике нативные вызовы WinRT что бы всё встало на свои места а уж потом изучать патерны при чём тут ваши нативные вызовы из WinRT, если async/await это конструкция языка, вы в отладчике await собрались искать? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:26 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Dima TТопик ушел в сторону обсуждения реализации async/await в .net, как оно на других ЯП никто не пишет, поэтому топик переезжает в профильный форум. а так-то однопоточный JavaScript напрямую противоречит первому же ответу в топике но.. топик охватывает все языки, реализующие паттерн async/await. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:33 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttDima TЯ консольные утилиты пишу, хотел поюзать async/await, но не придумал где, зато пришлось наоборот поискать как синхронно запустить xxxAsync(). Ну ясно. Если практика этим заканчивается, async/await вообще здесь не к месту. Т.е. ты признаешь что async/await не везде уместны? Тогда уточни где они уместны. Я один кейс обозначил - гуй, а еще где? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:37 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttMasterZivТебе вообще зачем __асинхронный__ вызов нужен? Наверное, чтобы он выполнялся параллельно с остальным кодом... А как оно будет выполняться параллельно, если ты тут же будешь ждать результат асинхнонного вызова? Похоже, вы очень сильно путаете понятия. Вот вам ссылка почитать Вкратце, асинхронный вызов мне нужен, чтобы I/O операции не блокировали рабочий поток из пула. Запуск подобного ожидания в параллельном потоке, это костыль, не решающий проблемы, но позволяющий, например, не блокировать единственный UI поток. В контексте серверных веб-приложений, подобный финт ушами вообще бесмысленнен. А в контексте, например, JavaScript и вовсе невозможен (не будем брать в расчёт не так давно появившиеся Web Workers). В общем, вернёмся к вопросу. Уточню, откуда ноги растут у вопроса. Проблемы две: 1. избыточность повсеместного ключевого слова await, если есть какое-то подозрение, что код модуля будет исполнять асинхронные методы, он тоже должен быть асинхронным. 2. забыли await, получили проблемы, особенно, если мы не ожидаем результат, а только сам факт асинхронного исполнения (async void). А ты уверен, что в текущих ОС, концепция async/await реализуема без многопоточки ? Мне кажется, что на этом шатком основании ты пытаешься что то доказать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:43 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Это я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена. С т.зрения Яваскриптера все вокруг это только браузер ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:44 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Dima TТ.е. ты признаешь что async/await не везде уместны? Тогда уточни где они уместны. Я один кейс обозначил - гуй, а еще где? В гуе тоже постольку поскольку. Уместны там, где интенсивно и в большом количестве используются асинхронные операции: доступ к БД, веб-запросы, работа с файлами. Особенно уместны в веб-приложениях, где небольшое количество потоков может обрабатывать сотни тысяч и миллионы запросов одновременно. На собственном примере, у нас года 3 назад было разработано веб-приложение. В период пиковых нагрузок оно падало на одном сервере. Пришлось масштабировать его на несколько серверов, чтобы решить проблему. Мы переписали код на использование async/await, логика и всё остальное осталось неизменным. В период следующих пиковых нагрузок, один единственный сервер уже с лёгкостью справлялся, хотя нагрузка даже увеличилась. Это из практики. Всё это хорошо, за исключением обозначенных мною проблем в начале топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:52 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
SiemarglА ты уверен, что в текущих ОС, концепция async/await реализуема без многопоточки ? А при чём тут многопоточка? Один или много потоков, async/await позволяет не блокировать их на время работы i/o операций, в этом основной смысл. SiemarglМне кажется, что на этом шатком основании ты пытаешься что то доказать. Тебе не просто кажется, это какие-то фантазии. Я ничего не пытаюсь доказать, я озвучил проблемы. Но как оказалось, народ в большинстве даже не понимает что это такое и с чем это едят. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:54 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
SiemarglЭто я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена. Верно, поэтому хотелось бы в прикладном коде работать с асинхронными вызовами и не задумываться о том, что они асинхронные. Сейчас приходится вставлять await. А я уверен, что без этого можно было бы обойтись :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 20:55 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>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(); запрос выполняется параллельно с демонстрацией прогресбара ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 21:24 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеевзапрос выполняется параллельно с демонстрацией прогресбара Запрос выполняется синхронно в параллельном потоке. Так как у вас десктопное приложение, которое выполняется монопольно для одного единственного пользователя, вы можете использовать потоки для реализации асинхронного поведения при запросах к БД, при условии, что их относительно не много, и нисколько не пострадать от этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 21:30 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttSiemarglЭто я к тому, что это взгляд с т.зр прикладного программиста, которому пофиг как жизь устроена. Верно, поэтому хотелось бы в прикладном коде работать с асинхронными вызовами и не задумываться о том, что они асинхронные. Сейчас приходится вставлять await. А я уверен, что без этого можно было бы обойтись :)Ты плачешь, что синтакс сахар недостаточно сладкий?! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 23:20 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Компьютер/компилятор тупой, подсказка с твоей стороны с await может только улучшить его работу. Например представь, что он попытается параллелить все операции (а почему бы и нет - выч блоков то у ЦПУ много) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 23:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
например, все лямбды без захвата по ссылке можно запускать асинхронно. а вот выгодно ли ? рановато еще, не доросли компилеры ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2018, 23:41 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttkealon(Ruslan)достаточно посмотреть в отладчике нативные вызовы WinRT что бы всё встало на свои места а уж потом изучать патерны при чём тут ваши нативные вызовы из WinRT, если async/await это конструкция языка, вы в отладчике await собрались искать? А вы сходства не видите между WinRT и Net? подставка кода под неочевидные конструкции языка называется compiler magic. под отладчиком я понимаю WinDbg. hVosttНа собственном примере, у нас года 3 назад было разработано веб-приложение. В период пиковых нагрузок оно падало на одном сервере. Пришлось масштабировать его на несколько серверов, чтобы решить проблему. Мы переписали код на использование async/await, логика и всё остальное осталось неизменным. В период следующих пиковых нагрузок, один единственный сервер уже с лёгкостью справлялся, хотя нагрузка даже увеличилась.профит получили, а откуда не поняли тут очень хорошо разжёвывают за счёт чего работают такие вещи hVosttа так-то однопоточный JavaScript напрямую противоречит первому же ответу в топике но.. топик охватывает все языки, реализующие паттерн async/await.никак не противоречит, но об этом пока говорить рано PS: Вера это конечно прикольно, но при споре об устройстве системы с системщиком её одной мало. Cкрины из системного отладчика были бы гораздо убедительнее ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 00:43 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttМы переписали код на использование async/await, логика и всё остальное осталось неизменным. В период следующих пиковых нагрузок, один единственный сервер уже с лёгкостью справлялся, хотя нагрузка даже увеличилась.у меня не вышло оставить логику. Унаследованный проект и вызов бд, сервиса был глубоко в стеке из 10 методов. А await требует выхода сразу наверх из стека. Т.е. он не запоминает код выше уровнем чтобы его потом продолжить. Только в этом же методе. Пришлось убирать стек и переписать все 10 методов(. Прискорбно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 07:24 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
SiemarglТы плачешь, что синтакс сахар недостаточно сладкий?! Я вроде озвучил проблемы в начале топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 07:31 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
SiemarglКомпьютер/компилятор тупой, подсказка с твоей стороны с await может только улучшить его работу. Например представь, что он попытается параллелить все операции (а почему бы и нет - выч блоков то у ЦПУ много) Он не пытается распараллелить async/await, это про другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 07:38 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Siemarglнапример, все лямбды без захвата по ссылке можно запускать асинхронно. а вот выгодно ли ? рановато еще, не доросли компилеры асинхронно можно запускать асинхронные методы. если программист решил, что он хочет асинхронного поведения для синхронного кода, запускаемого в параллельном потоке, это с точки зрения вызова тоже будет асинхронно, но это будет лишь асинхронное ожидание. код с async/await с точки зрения потока исполнения не имеет ничего общего с параллелизмом. поэтому вы не можете, например, использовать блокировки потока. только семафоры. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 07:40 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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крины из системного отладчика были бы гораздо убедительнее Вы похожи на бабку возле подъезда, которая с ходу ставит точный диагноз любому проходящему мимо мужчине или женщине. Нашли же себе занятие. Детский сад. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 07:48 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123у меня не вышло оставить логику. Унаследованный проект и вызов бд, сервиса был глубоко в стеке из 10 методов. Древний легаси исправить на использование a/a почти невозможно, нужно всё переписывать :) Но у нас был не древний легаси, при написании была выстроена вменяемая архитектура, позволяющая это сделать, тогда уже задумывались о переходе на async-first, но не решались. А потом решились. Сейчас проекты пишутся async-first. Всё хорошо. Раньше использовать асинхронность было тяжело из-за неудобного апи, поэтому большинство забило на это болт и просто запускали потоки. Сейчас стало возможно писать такой код в полный рост, но вылезли две проблемы, о которых я напомню: 1. слишком частое употребление ключевого слова await, где я пока не вижу причин, почему компилятор не мог бы вывести его сам (в async-блоке это просто явно и очевидно). 2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично. 3. (опционально) некоторым не нравится, что отлаживаться под async/await сложнее, чем с синхронным кодом. но это потому что они до этого вообще не работали с асинхронным кодом, раньше было ещё сложнее :) но обещают улучшить ситуацию, правда меня это особо не трогает. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 08:18 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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 полностью лежит на функции которая его вернула что непонятно? с чем не согласны? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 08:22 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Полистал Рихтера "CLR via C# 4-е издание" Глава 28. Асинхронные операции ввода-вывода. Подробно разжевано как устроены async/await (целиком читал 3-е издание, надо уже собраться и это прочитать) Под капотом асинхронного IO .net использует надстройку над виндовым I/O Completion Port . По ссылке подробно расписано как он устроен. Если кратко: виндовсу дается задание на чтение или запись и освобождается текущий поток, как только задание выполняется, виндовс будит один из потоков-обработчиков из заранее созданного пула. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 08:28 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttДостали вы меня, в C++ есть async/await? Нету. Вообще то есть. Сделано через концепцию future/promise ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 08:31 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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. Но это не важно. Вы видели мой вопрос в начале топика? Я говорил где-то, а давайте обсудим сам паттерн, нужен ли он вообще, как он устроен, чё там видно в дебагере и т.п.? Может хватит офтопить? Или давайте заведём отдельную тему, где обсудим эти вопросы? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 08:38 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Dima TПолистал Рихтера "CLR via C# 4-е издание" Глава 28. Асинхронные операции ввода-вывода. Подробно разжевано как устроены async/await (целиком читал 3-е издание, надо уже собраться и это прочитать) Под капотом асинхронного IO .net использует надстройку над виндовым I/O Completion Port . По ссылке подробно расписано как он устроен. Если кратко: виндовсу дается задание на чтение или запись и освобождается текущий поток, как только задание выполняется, виндовс будит один из потоков-обработчиков из заранее созданного пула. Ну слава те хоспади! :) Только эта же реализация использовалась и ранее, на устаревшем асинхронном API (APM, EAP), просто из-за её неудобств, абсолютное большинство вообще не знали что это такое и как этим пользоваться. Просто запускали фоновые потоки для асинхронного поведения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 08:41 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
SiemarglhVosttДостали вы меня, в C++ есть async/await? Нету. Вообще то есть. Сделано через концепцию future/promise Это другой паттерн. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 08:42 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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. Но это не важно. Вы видели мой вопрос в начале топика? Я говорил где-то, а давайте обсудим сам паттерн, нужен ли он вообще, как он устроен, чё там видно в дебагере и т.п.? Может хватит офтопить? Или давайте заведём отдельную тему, где обсудим эти вопросы? я их с натива дёргаю, а ты говоришь что это всё мистика, ты адекватный? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 08:55 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttSiemarglпропущено... Вообще то есть. Сделано через концепцию future/promise Это другой паттерн.Я смотрю MSIL и вижу ту же самую реализацию. Давай еще раз. Ты сначала пишешь. hVosttДумаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно. Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно? .. И потом hVostt2. забыли await, получили проблемы, особенно, если мы не ожидаем результат, а только сам факт асинхронного исполнения (async void). Так нужен тебе await или не нужен ? Приведи что ли кусок кода, где ты считаешь его ненужным. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 09:07 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично. Есть ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 09:42 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 09:55 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttПонятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, Ну так а какие аргументы еще нужны? Код либо ждем (await) Либо не ждём (без await) - по каким то причинам. Например - потом подождём. Ну и всё. ) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:06 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)упустим ваши современные английские манеры Не нужно писать, что у меня нет ответа, когда я его давал и не однократно. Если это по-вашему офигеть какие адекватные манеры, то для вас у меня плохие новости. kealon(Ruslan)я их с натива дёргаю, а ты говоришь что это всё мистика, ты адекватный? В нативе нет никаких async/await, в чём ваша проблема, не пойму? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:10 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
SiemarglЯ смотрю MSIL и вижу ту же самую реализацию. Приведите код и давайте посмотрим на MSIL. Не знаю чего вы там видите. SiemarglТак нужен тебе await или не нужен ? Мне нужен await, но считаю, что использование ключевого слова в большинстве случаев избыточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:11 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Алексей КhVostt2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично. Есть Ок, сейчас проверим. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:12 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, наверное всегда избыточно await можно поставить автоматом всегда (ну, вроде как) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:13 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Агнец за бортомНу так а какие аргументы еще нужны? Код либо ждем (await) Либо не ждём (без await) - по каким то причинам. Например - потом подождём. Ну и всё. ) В смысле, потом? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:13 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRoshVostt, наверное всегда избыточно await можно поставить автоматом всегда (ну, вроде как) Я тоже так думаю, благодаря ключевому слову async для блока метода, компилятор понимает, что тело может содержать асинхронные вызовы. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:14 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttЯ тоже так думаю, благодаря ключевому слову async для блока метода, компилятор понимает, что тело может содержать асинхронные вызовы. Может, но необязательно содержит, кроме того, метод может возвращать Task, но не содержать асинхронных вызовов и ключевого слова asynс А еще может понадобиться запустить асинхронный метод и не ждать его окончания. А еще есть async void - асинхронные методы, которые не получится ждать ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:17 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttViPRoshVostt, наверное всегда избыточно await можно поставить автоматом всегда (ну, вроде как) Я тоже так думаю, благодаря ключевому слову async для блока метода, компилятор понимает, что тело может содержать асинхронные вызовы. Это необходимо, но недостаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:20 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Нужен еще анализ - есть ли обращение к TaskResult где нить ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:22 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
И воще еще раз возвращаюсь к тому что надо было явно выделить (не через соглашение, а как свойство таск) I/O Port таски и тогда не было бы путаницы этой и не надо было писать асунк-авайт вообще ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:26 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Алексей КhVostt2. нет инструментов, которые контролируют забытый await. приходится писать дополнительный код проверки там, где это критично. Есть Проверил, верно, нужно добавить в CSPROJ Код: xml 1.
Это снимает проблему №2 :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:26 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProМожет, но необязательно содержит, кроме того, метод может возвращать Task, но не содержать асинхронных вызовов и ключевого слова asynс А еще может понадобиться запустить асинхронный метод и не ждать его окончания. А еще есть async void - асинхронные методы, которые не получится ждать Поэтому нужен контракт, хотя бы атрибут для методов интерфейса. Вообще, конечно, можно задействовать Fody и добиться желаемого, но это капец плохая идея :) Насчёт async void, ща так делать моветон :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:30 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRosНужен еще анализ - есть ли обращение к TaskResult где нить Ну это без разницы же. ViPRosИ воще еще раз возвращаюсь к тому что надо было явно выделить (не через соглашение, а как свойство таск) I/O Port таски и тогда не было бы путаницы этой и не надо было писать асунк-авайт вообще Это нужно было, чтобы вставлять костыли в виде запусков тасков в отдельном потоке там, где нет поддержки асинхронной реализации. Например, правайдер оракла до сих пор не умеет async. Поэтому вызовы нужно оборачивать в Task.Run, чтобы интерфейсы не ломать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:32 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttАгнец за бортомНу так а какие аргументы еще нужны? Код либо ждем (await) Либо не ждём (без await) - по каким то причинам. Например - потом подождём. Ну и всё. ) В смысле, потом? ) Никто же не запретит использовать к примеру такую "конструкцию" Код: c# 1. 2. 3. 4. 5. 6.
компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:33 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttНасчёт async void, ща так делать моветон :)Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:34 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRhVosttпропущено... В смысле, потом? ) Никто же не запретит использовать к примеру такую "конструкцию" Код: c# 1. 2. 3. 4. 5. 6.
компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто... Не просто, но можно ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:36 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttViPRosНужен еще анализ - есть ли обращение к TaskResult где нить Ну это без разницы же. Как без разницы? А если запустил и забыл? Разве тут нужен await? (я только читал, не писал) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:37 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttАгнец за бортомНу так а какие аргументы еще нужны? Код либо ждем (await) Либо не ждём (без await) - по каким то причинам. Например - потом подождём. Ну и всё. ) В смысле, потом? ) Ты сам сказал, собрать всё в коллекцию и дождаться их парралельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:39 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRosНе просто, но можно Ну, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task - сможет ли компилятор отследить все лабиринты мысли хитроумного разработчика? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:42 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRViPRosНе просто, но можно Ну, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task - сможет ли компилятор отследить все лабиринты мысли хитроумного разработчика? во всяком случае я бы мог это прогить :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:45 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRНикто же не запретит использовать к примеру такую "конструкцию" Код: c# 1. 2. 3. 4. 5. 6.
компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто... Пока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:52 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProhVosttНасчёт async void, ща так делать моветон :)Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий. Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:53 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRosКак без разницы? А если запустил и забыл? Разве тут нужен await? (я только читал, не писал) "Запустил и забыл" нужно делать через управляемый менеджер задач, в самом примитивном случае, Task.Run. Но это по фуншую ) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:54 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttLRНикто же не запретит использовать к примеру такую "конструкцию" Код: c# 1. 2. 3. 4. 5. 6.
компилятору, чтобы проставить await для Meth2async придется узнать что где-то там будет с х, а это не всегда просто... Пока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :) Это не очевидно ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:54 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttПока не понял в чём проблема. В async-блоке два вызова асинхронных методов. Надо вставить await для каждого :) LRНу, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:54 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Агнец за бортомТы сам сказал, собрать всё в коллекцию и дождаться их парралельно. Да, здесь требуется ручное управление, поэтому нужен специальный синтаксис для таких довольно редких случаев. Я не думал пока об этом ) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:56 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRosЭто не очевидно Почему? Вроде очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:56 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, все это можно разрулить автоматом ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:57 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRНу, предположим, передается в качестве параметра object несколько раз и в какой-нить н-той функции приводится к типу Task Тогда никак, только ручной await. Ну это совсем дикие примеры ) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:57 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttViPRosЭто не очевидно Почему? Вроде очевидно. нет там await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:58 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRoshVostt, все это можно разрулить автоматом Ну смотри. Если ты хочешь предоставить прикладным разработчикам некий DSL, тебе не захочется объяснять им, что если вы хотите запросить данные, вам надо это делать через жопу через некий промис, или коллбек, и оставшийся код надо поместить в коллбек, или не забудьте сделать await. И вообще сломать им голову, итак забитой под завязку предметкой. Да, придётся рулить автоматом. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 10:59 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRosтам await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет) Приведение должно быть типа таким (async Task), потому что Task ещё не говорит об асинхронности. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:00 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttViPRosтам await вроде и не нужен вовсе (все зависит от того - будет ли x приведен в Task или нет) Приведение должно быть типа таким (async Task), потому что Task ещё не говорит об асинхронности. по любому, только приведение скажет - нежен await или нет ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:01 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
вощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно или косвенно await не нужен) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:04 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRosвощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно или косвенно await не нужен) Тогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен))) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:09 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRТогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен))) Да простого приведения было бы достаточно :) Это как я всё жду, когда для ссылочных типов будет можно написать так: Код: c# 1. 2.
т.е. есть тип string и string! по аналогии int и int? или наоборот string и string? так же и с асинком (async Task)value и (Task)value, взяли и скрыли async от компилятора :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:12 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRViPRosвощем мое имхо - компилятор мог бы обойтись без await (только одно логичное соглашение - если результат не затребован явно или косвенно await не нужен) Тогда разумно вместо await задействовать какой-нить noawait (для редких случаев) - и компилятору меньше работы, и hVostt будет удовлетворен))) угу ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:14 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Следующий вопрос, может кто решал. Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:17 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttКак заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)замена в исходниках по регулярке ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:29 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttShocker.Proпропущено... Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий. Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)нет. У меня проект, где я в цикле делаю await и результат мне нужен без Task<... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:39 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttСледующий вопрос, может кто решал. Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)Да никак. Но можно локально убить контекст синхронизации. Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:39 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123hVosttпропущено... Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)нет. У меня проект, где я в цикле делаю await и результат мне нужен без Task<...причем тут результат и void??? Так или иначе ты можешь запустить метод с таском без ожидания результата, для этого тебе void необязателен. Как правильно говорит Хвост, void оставлен только для сохранения сигнатуры для событий ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:43 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Алексей КДа никак. Но можно локально убить контекст синхронизации. Код: c# 1. 2. 3. 4.
Ну это понятно. В общем, тут очевидно, что сделали слегка по-дебильному. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:50 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttВ общем, тут очевидно, что сделали слегка по-дебильному.Слегка - не то слово! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:54 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.Pro, Ты про то чтобы убрать слово void тут? private async void MyRun() Ну, это и коню понятно что не надо трогать. Чтобы убрать await я тоже против. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 11:56 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, Ещё камень в авторов ConfigureAwait . ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 12:01 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Алексей КhVostt, Ещё камень в авторов ConfigureAwait . Согласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false). Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 12:03 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttНо сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации Ну да. HttpContext.Current там нет, а значит и контекст синхронизации там ни к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 12:06 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Библиотеки все таки не часто пишем. А core пока ещё не ГУИ. Так что пока не наезжайте на сабж) сильно. )) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 12:09 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttСогласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false). Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации Но временнЫе затраты на переключение контекста ведь никто не отменял... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 12:13 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProhVosttСогласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false). Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации Но временнЫе затраты на переключение контекста ведь никто не отменял... Никто не отменял, поэтому ConfigureAwait(false) приходится втыкать. Ещё есть такая штукенция https://github.com/Fody/ConfigureAwait Но такие вещи нужно применять с осторожностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 12:19 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProhVosttКак заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)замена в исходниках по регулярке ))) У нас есть Roslyn ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2018, 14:20 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Алексей КhVostt, Ещё камень в авторов ConfigureAwait . Это далеко не все тараканы https://www.infoworld.com/article/2960463/application-development/my-two-cents-on-synchronizationcontext-async-and-await.html ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 11:40 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Не та ссылка - https://blogs.msdn.microsoft.com/pfxteam/2012/06/15/executioncontext-vs-synchronizationcontext/ ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 11:44 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Изопропил, Есть такой онекдот. Доктор, почему когда я сильно заворачиваю руку за спину, сгибаюсь и прыгаю на одной ноге, через какое-то время мне становится больно? Не делайте так. И вот, пример, который я ждал с самого начала статьи: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Дядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда. И так многие делают. Вот два решения проблемы: 1. заставим наш говнокод работать Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
2. включим мозг и напишем по-людски Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Глобально решают задачу, отказываюсь от контекста синхронизации совсем. Остаётся execution flow, и с блокировками нужно по-аккуратнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 14:09 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Ещё в примере есть небольшой косячок, надо так :) Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 14:12 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt Код: c# 1.
почему Task - это ж эвентхендлер? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 14:35 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttДядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда.Придется показать себя неучем. Почему Compute будет выполняться в UI потоке (без ConfigureAwait(false)), если мы до этого уже эвеитим задачу, в которой должен быть выполнен делегат, то есть он уже как бы начал выполняться не в потоке UI, и возврат из DownloadAsync должен быть не в поток UI, а в поток, в котором выполняется задача из пула. Или я где-то недопонял с возвратом. (( ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 14:42 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttДядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда. Наверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 14:43 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.Pro, опередили))) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 14:44 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.Proпочему Task - это ж эвентхендлер? да, void, но всё равно async )) давненько за десктоп не брался ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 15:29 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt Код: c# 1.
Можно так: Compute(){ ....... Action a = () => метод в гуи } ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 15:30 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProПридется показать себя неучем. Почему Compute будет выполняться в UI потоке (без ConfigureAwait(false)), если мы до этого уже эвеитим задачу, в которой должен быть выполнен делегат, то есть он уже как бы начал выполняться не в потоке UI, и возврат из DownloadAsync должен быть не в поток UI, а в поток, в котором выполняется задача из пула. Или я где-то недопонял с возвратом. (( там же await, который не блокирует поток. ContinueAwait(false) позволяет выполнить оставшуюся часть метода любым из свободных потоков, даже тем, который был использован для запуска задачи. главное понимать, что Task это не поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 15:40 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRНаверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет? нет, никакого ожидания не будет, точнее будет то, что называется асинхронным ожиданием, но это по сути метафора к тому, что происходит на самом деле ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 15:43 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttтам же await, который не блокирует поток. ContinueAwait(false) позволяет выполнить оставшуюся часть метода любым из свободных потоков, даже тем, который был использован для запуска задачи. главное понимать, что Task это не поток. Не, не врубаюсь. Есть UI-поток, он запустил делегат в другом потоке (A) и ждет его завершения. Делегат выполняется в потоке А и запускает DownloadAsync в потоке В При отсутствии ConfigureAwait(false) после завершения DownloadAsync выполнение должно вернуться в поток В и в нем выполниться Compute Поток B - это не поток UI Где я ошибаюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 16:04 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttнет, никакого ожидания не будет, точнее будет то, что называется асинхронным ожиданием, но это по сути метафора к тому, что происходит на самом деле это да, пусть будет "метафора", но лучше метафора об ожидании, чем об выполнении в UI-потоке hVosttвыполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке о каком выполнении в UI-потоке идет речь? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 16:18 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRНаверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет? Наверное правильнее сказать, что выполнение UI потока будет продолжено в той точке, в которой завершится выполнение задачи. Во время выполнения той задачи UI поток свободно может выполнять другие задачи, те же обслуживания выполнения других событий. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 16:39 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ЕвгенийВLRНаверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет? Наверное правильнее сказать, что выполнение UI потока будет продолжено в той точке, в которой завершится выполнение задачи. Во время выполнения той задачи UI поток свободно может выполнять другие задачи, те же обслуживания выполнения других событий. Пожалуй, что и так... Но длинновато, проще сказать, что UI поток будет "поджидать" в той точке...))) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 16:49 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Блин))) await оператор ожидания. Назовите его GoTo, каллбэк и т.д. и т.п. Слова поток можно не употреблять. Кому как нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 17:42 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123Блин))) await оператор ожидания. Назовите его GoTo, каллбэк и т.д. и т.п. Слова поток можно не употреблять. Кому как нравится. await - не оператор ожидания! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 18:32 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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 и пошёл гулять. Он как разнорабочий, залил цементный раствор и пошёл курить, или ещё что-то делать. Мимо проходил другой или тот же самый рабочий, увидел, что цемент застыл и продолжил начатую работу здесь. А главный поток это Прораб, который по умолчанию поручает, чтобы его звали каждый раз, когда длительная операция закончится (застывание цемента, например). Без него ничего не может продолжится, если не сконфигурировано иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 18:52 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRо каком выполнении в UI-потоке идет речь? О синхронном коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 18:53 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ЕвгенийВPetro123Блин))) await оператор ожидания. Назовите его GoTo, каллбэк и т.д. и т.п. Слова поток можно не употреблять. Кому как нравится. await - не оператор ожидания! Смешно. Оператор await используется для ожидания Так подходит?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:17 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Поможет только внимательный разбор исходников ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, в той статье автор пространно размышлял примерно так: "В таск перетекает ExecutionContext, вместе с ним, как часть, SynchronizationContext.Current, и если перетекает действительно "в статусе текущего" - тогда это плохо, ибо, например, вот в таком коде это приведет к (нежелательному) выполнению Compute(data) на UI-потоке". Заканчиваются эти размышления обзором internal-методов в mscorlib и заключительной фразой: "In short, SynchronizationContext.Current does not “flow” across await points." ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123, Тревожное ожидание (лучше бы - тревожная работа (работаешь(отдыхаешь) и ждешь звоночка)) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:26 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ИзопропилПоможет только внимательный разбор исходников Поможет внимательное прочтение асинхронного ввода/вывода в Windows NT ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:27 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LR, Это зависит от конфигурации await вызова, и работает для кода продолжения, но контекст синхронизации не назначается потоку, как это можно сделать старым способом через Post или через шедулер. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 19:47 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRosИзопропилПоможет только внимательный разбор исходников Поможет внимательное прочтение асинхронного ввода/вывода в Windows NT этого недостаточно. он сильно проще и логичнее в NT ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 20:16 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 20:24 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Изопропилвроде как всё понятно да, и касательно 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2018, 20:51 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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-а ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 05:09 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>Petro123, вчера, 19:17 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21633388][21633388] >...Оператор await используется для ожидания. <Может быть так: В коде вызывающего метода оператор await используется для ожидания завершения кода вызванного метода. Коды других методов, обработчиков сообщений, могут работать асинхронно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 08:43 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProИтак, UI-поток запустил делегат на потоке из пула (А). Когда делегат закончит выполнение, тогда будет продолжение в UI-потоке (а именно, выполнится присвоение button1.Text =) Ты думаешь, что UI-поток получит управление только в точке вызова Task, т.е. на момент присвоения button1.Text, но это не так. UI-поток подключится после любого await, не важно какой каскад функций был вызван внутри, если не сконфигурировано иначе. Обычно принято в библиотеках везде втыкать ConfigureAwait, чтобы разработчик не получал фризы и дедлоки. Shocker.ProТак как при вызове DownloadAsync() нет ConfigureAwait(false), то продолжение в делегате после await-а (а именно метод Compute()) должен выполняться в потоке А. Где я не прав? Ты всё ещё думаешь, что после выполнения асинхронного метода есть какой-то поток А, который запустил DownloadAsync и теперь сидит ждёт, когда он выполнится :) После запуска асинхронного метода, поток освободился, и где будет выполнятся продолжение метода теперь зависит от ConfigureAwait. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 08:49 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttТы думаешь, что UI-поток получит управление только в точке вызова Task, т.е. на момент присвоения button1.Text, но это не так. UI-поток подключится после любого await, не важно какой каскад функций был вызван внутри, если не сконфигурировано иначе. Откуда такое заблуждение? Вся та статья как раз и посвящена доказательству того что это не так (что контекст синхронизации не переходит через await, а значит, если вызов async-метода производится не из UI-потока, то и продолжение не будет выполнятся в UI-потоке, что бы там в ConfigureAwait не задавалось). Вот как в этой точке UI-поток может получить управление? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Разве что так, но ведь разговор идет вовсе не об этом Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 09:56 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttчто после выполнения асинхронного метода есть какой-то поток АТо есть именно этот поток может уже и не существовать, когда возникает необходимость продолжения, ок, это дошло. Я всегда пишу ConfigureAwait(false) кроме начальных вызовов из UI-потока, даже если и не в библиотеках. Получается, что если ConfigureAwait(false) где-то забыл, то мы получим продолжение в контексте синхронизации независимо от глубины вложенности await-ов. При этом если забыли ConfigureAwait(false) на N-ом уровне вложенности, продолжение N-ого уровня выполнится в UI-потоке, и все по цепочке N-1, N-2... обратно к началу вызовов начнет выполняться в UI-потоке, потому что ConfigureAwait(false) разрешит не менять поток при продолжении. Теперь я правильно понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 09:57 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.Pro, ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключение ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 10:32 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключениеConfigureAwait(false) разрешает выполнять продолжение в том же потоке, но меня пока интересует обратная ситуация... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 10:34 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеев>Petro123, вчера, 19:17 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21633388][21633388] >...Оператор await используется для ожидания. <Может быть так: В коде вызывающего метода оператор await используется для ожидания завершения кода вызванного метода. Коды других методов, обработчиков сообщений, могут работать асинхронно. Это противоречит? Уточняет? Добавляет эмоции? Зачем ты это написал? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 10:57 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRесли вызов async-метода производится не из UI-потока,это когда нибудь требуется? Или это чисто абстрактно? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 11:02 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.Prokealon(Ruslan)ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключениеConfigureAwait(false) разрешает выполнять продолжение в том же потоке, но меня пока интересует обратная ситуация...именно что в любом Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 11:12 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRОткуда такое заблуждение? Вся та статья как раз и посвящена доказательству того что это не так (что контекст синхронизации не переходит через await, а значит, если вызов async-метода производится не из UI-потока, то и продолжение не будет выполнятся в UI-потоке, что бы там в ConfigureAwait не задавалось). Зачем ему переходить? И почему заблуждение? Сейчас покажу. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
LRВот как в этой точке UI-поток может получить управление? Давайте от обратного. Если он его там не получит, то невозможно в продолжении взаимодействовать с UI. Если UI поток не может выполнять код после await где-то внутри цепочки вызовов функций, значит невозможно будет написать сколько-нибудь серьёзный код с использованием await. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 11:40 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009] >...Зачем ты это написал? <Я так думаю. UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 11:43 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009] >...Зачем ты это написал? <Я так думаю. UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 11:45 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 11:46 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Ещё есть такой трюк Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
(источник) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 11:48 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttЗачем ему переходить? И почему заблуждение? Сейчас покажу. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Это работать не будет. Будет 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. Весьма странный довод. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 12:04 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttДа, глубина вложенности не имеет значения, так как компилятор строит конечный автомат. Ну примерно, да :)То есть, если я напишу грубо говоря Код: c# 1. 2.
это будет работать, из какого бы метода это не было вызвано? hVosttЭто нужно делать только в библиотеках, которые однозначно не взаимодействуют с UI и которым не требуется контекст синхронизации.Ну если это код хелпера, например, внутри проекта, который не взаимодействует с UI, зачем мне его выполнять в UI? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 12:05 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttЕщё есть такой трюк Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
(источник) Чета я не допираю. INotifyCompletion Нафига у ThreadPoolRedirector другие члены окромя OnCompleted? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 12:05 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеев>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009] >...Зачем ты это написал? <Я так думаю. UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет. Не нужно додумывать за MS. У МS термин ожидание это не form.ShowModal; из дельфи прошлого века. Где код ГУИ встал на этой строчке. Ожидание потока имеется ввиду. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 12:14 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProНу если это код хелпера, например, внутри проекта, который не взаимодействует с UI, зачем мне его выполнять в UI? Ну может это хелпер, который может обновлять ProgressBar. Или ещё что-то делать. Серьёзные приложения имеют сложность, которая не укладывается код обработчиков событий. Код слишком большой, чтобы размещать его там, если интенсивно используются асинхронные операции. Ну и MVP/MVVM никто не отменял :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 15:20 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProТо есть, если я напишу грубо говоря Код: c# 1. 2.
это будет работать, из какого бы метода это не было вызвано? Если в цепочке вызовов везде будет await, да. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 15:21 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttЕсли в цепочке вызовов везде будет await, да.А какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 15:22 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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.
Это работает. А теперь немного треша, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Два await это не ошибка :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 16:06 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ЕвгенийВЧета я не допираю. INotifyCompletion Нафига у ThreadPoolRedirector другие члены окромя OnCompleted? Для await нужен объект с методом GetAwaiter ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 16:15 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProА какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток? По поводу вопроса, ещё раз. Если ты вызовешь Wait или Result на таске вместо await, а внутри будет await без ConfigureAwait(false) будет гарантированный дедлок. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 16:16 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>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(); ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 16:49 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВЧета я не допираю. INotifyCompletion Нафига у ThreadPoolRedirector другие члены окромя OnCompleted? Для await нужен объект с методом GetAwaiter Т. е. для решение проблемы, о которой можно сказать, хз, есть она или нет, скорее всего нет, если механизмом async/await пользоваться только там, где он предназначен используется следующее решение - "Используйте механизм, о котором в документации явно сказано, что это инфраструктура и нефик юзать в прикладном коде (как минимум могут изменить механизм), при чем эта инфраструктура юзает утиную типизацию. А само "решение" гарантированно подменяет пул потоков созданный специально для тасков, на пул ThreadPool существующий со времен царя Гороха." ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 17:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, В сложных прогах лучше не пользоваться асинк авейт думаю - фиг концов найдешь потом ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 17:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеев, Открой наконец для себя возможности форматирования кода! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 17:27 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ЕвгенийВТ. е. для решение проблемы, о которой можно сказать, хз, есть она или нет, скорее всего нет, если механизмом async/await пользоваться только там, где он предназначен используется следующее решение - "Используйте механизм, о котором в документации явно сказано, что это инфраструктура и нефик юзать в прикладном коде (как минимум могут изменить механизм), при чем эта инфраструктура юзает утиную типизацию. А само "решение" гарантированно подменяет пул потоков созданный специально для тасков, на пул ThreadPool существующий со времен царя Гороха." Ну в целом, знать как это устроено внутри полезно, но для использования нужно абстрагироваться. Нужно было бы. Если бы C# изначально проектировался с async/await, возможно получился бы простой и лёгкий синтаксис, как в Go. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 18:20 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ViPRoshVostt, В сложных прогах лучше не пользоваться асинк авейт думаю - фиг концов найдешь потом Мы проект написали полностью async-first. Из плюсов: 1. Асинхронный вызов можно встроить в любой точке на любой глубине кода. 2. Высокопроизводительное решение для обработки огромного числа запросов пользователей. Из минусов: 1. Дофига await. 2. Дофига ConfigureAwait(false) -- помогают расширения решарпера и рослин, можно автоматизировать процесс. 3. В некоторых случаях, функциональный подход (аля промисы) -- лучше, для этого приходится оборачивать async/await (дожили). 4. Все минусы меркнут перед сложностью отладки. Нет, IDE не встанет заботливо на точку по месту ошибки. Те, кто привыкли так работать страдают и воют как кони. Но если изначально отказываться от разработки через отладку, проблем нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 18:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttМы проект написали полностью async-first. Из плюсов: 1. Асинхронный вызов можно встроить в любой точке на любой глубине кода. Чет ты перегнул. Как вставить по стеку в глубине, если async не поддерживает стек? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 18:38 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123Чет ты перегнул. Как вставить по стеку в глубине, если async не поддерживает стек? ну заведомо синхронные методы -- синхронные, без фанатизма, их намного больше. но все сервисы, службы, шины, менеджеры, и прочее -- асинхронные. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 18:39 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, Ну, понятно. async First это просто "делайте чаще чтобы гуи не морозило)) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 18:46 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt Ну в целом, знать как это устроено внутри полезно, но для использования нужно абстрагироваться. Нужно было бы. Если бы C# изначально проектировался с async/await, возможно получился бы простой и лёгкий синтаксис, как в Go. А что в GO такого легкого и простого? Ужасные горутины и каналы? Просто мерзкая обработка ошибок? И никакого ГУЯ! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 19:06 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ЕвгенийВА что в GO такого легкого и простого? Ужасные горутины и каналы? Просто мерзкая обработка ошибок? И никакого ГУЯ! почему ужасные? сравнивать напрямую нельзя конечно, так как другая парадигма. кстати, в .NET тоже будут каналы, скоро. пока в глубокой бете. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 19:12 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttбудут каналы, скоро.вот я не понимаю почему сабж со стеком не работает? Код: c# 1. 2. 3. 4. 5. 6.
Вот как вставить асинхронный метод в метод2? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 19:23 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123вот я не понимаю почему сабж со стеком не работает? что ты имеешь в виду? Petro123Вот как вставить асинхронный метод в метод2? сделать Metod2 асинхронным _) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 19:34 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt почему ужасные? сравнивать напрямую нельзя конечно, так как другая парадигма. Ужасные - это касалось горутин. Обычный запуск задачи в отдельном потоке. hVosttкстати, в .NET тоже будут каналы, скоро. пока в глубокой бете. Про каналы ничего не имею против, особенно когда они допускают межпроцессорное и межкомпьютерное взаимодействие. В .NET они уже были 9 лет назад. Axum Введение в язык программирования Axum ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 19:35 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttсделать Metod2 асинхронным _)как сделать без замены возврата bool? Этод метод вызывается в куче мест. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 19:54 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttчто ты имеешь в виду?CreateMap() будет вызвана до окончания потока внутри метода2. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 19:57 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>Petro123, сегодня, 18:38 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634863][21634878] >...Нет, IDE не встанет заботливо на точку по месту ошибки. Те, кто привыкли так работать страдают и воют… <Что-то не понимаю: ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 20:04 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ЕвгенийВУжасные - это касалось горутин. Обычный запуск задачи в отдельном потоке. Почему в отдельном потоке? Это уж как повезёт :) ЕвгенийВПро каналы ничего не имею против, особенно когда они допускают межпроцессорное и межкомпьютерное взаимодействие. В .NET они уже были 9 лет назад. https://www.nuget.org/packages/System.Threading.Channels :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 20:29 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123как сделать без замены возврата bool? Этод метод вызывается в куче мест. никак, либо две версии метода ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 20:30 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеев<Что-то не понимаю: Код на скрне полностью синхронный. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 20:31 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
>hVostt, сегодня, 20:31 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634947][21634947] >Код на скрне полностью синхронный. <А так: ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 21:03 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
ВМоисеев, И чего? Вы точку останова поставили. Речь идёт о сваливании с исключением и остановкой дебагера на этом месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2018, 21:12 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttПо поводу вопроса, ещё раз. Если ты вызовешь Wait или Result на таске вместо await, а внутри будет await без ConfigureAwait(false) будет гарантированный дедлок.По поводу вложенности еще раз. Если await без ConfigureAwait(false) на первом уровне - то дедлок понятен, а если, к примеру, первый-второй уровень вложенности идет с ConfigureAwait(false), а на третьем забыли. Будет ли дедлок и если да, то почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 05:01 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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.
А здесь будет ошибка Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 10:23 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.Pro, Необходимо понимать, что ConfigureAwait на сам вызов метода не влияет, только на продолжение. Для кода, выполняемого после ConfigureAwait контекст потерян, и там уже не имеет значения, есть ConfigureAwait или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 10:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttНеобходимо понимать, что ConfigureAwait на сам вызов метода не влияет, только на продолжение.это я понимаю. Я не понимаю какой-то другой нюанс в твоем изначальном примере и пытаюсь его нащупать... Я, похоже, вот какой момент не до конца осознавал... при вызове асинхронного метода (в том числе каскадно) его (их) операторы будут выполняться в вызвавшем потоке до первого встреченного await-а. Я воспринимал, что операторы сразу начнут выполняться в другом потоке. И, кажется, я это знал, но забыл )) Отсюда все мои предыдущие вопросы можно аннулировать Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 11:16 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttСейчас проекты пишутся async-first. Всё хорошо.При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 11:17 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Вот пример, где ConfigureAwait(false) не спасает от дедлока, это только у меня так? (WinForms, VS2017, FW 4.5.2-4.6.2) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
ConfigureAwait(false) лишь отменяет требование выполнять продолжение в первоначальном контексте, т.е., дает "добро" на любой контекст, в т.ч. не исключая первоначальный. В данном примере, вероятно, async-инфраструктуре "влом" идти и брать свободный поток из пула, и выбирается то, что "под боком" - а это (уже блокированный ожиданием .Result) UI-поток. Или все происходит как-то по другому? Может кто-нибудь проверить этот пример у себя? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 11:35 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProhVosttСейчас проекты пишутся async-first. Всё хорошо.При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?забить студия не даст. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 11:57 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123забить студия не даст.С чего вдруг не даст? Даже решарпер - и тот не настаивает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 12:05 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProЯ, похоже, вот какой момент не до конца осознавал... при вызове асинхронного метода (в том числе каскадно) его (их) операторы будут выполняться в вызвавшем потоке до первого встреченного await-а. Я воспринимал, что операторы сразу начнут выполняться в другом потоке. И, кажется, я это знал, но забыл )) Отсюда все мои предыдущие вопросы можно аннулировать Да, до первого await, который вернёт незавершённую задачу (важное уточнение), всё будет синхронно. Shocker.ProПри этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные? Нет, не забили. Все асинхронные методы имеют суффикс Async. Контролируется на этапе сборки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 13:09 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProPetro123забить студия не даст.С чего вдруг не даст? Даже решарпер - и тот не настаивает. хм... Проверил, ты прав. Убрал суффикс и не ругается. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 13:10 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttКонтролируется на этапе сборки.тоже помню где то ругалась. Счас проверил - f2, переименовать - не ругается) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 13:12 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRConfigureAwait(false) лишь отменяет требование выполнять продолжение в первоначальном контексте, т.е., дает "добро" на любой контекст, в т.ч. не исключая первоначальный. В данном примере, вероятно, async-инфраструктуре "влом" идти и брать свободный поток из пула, и выбирается то, что "под боком" - а это (уже блокированный ожиданием .Result) UI-поток. Или все происходит как-то по другому? Может кто-нибудь проверить этот пример у себя? https://stackoverflow.com/questions/18524609/configureawaitfalse-still-deadlocks Меняем на HttpClient и проблема исчезает. Вообще, от WebCliet надо уже дааааааавным давно уже было отказаться везде где только можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 13:17 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttНет, не забили. Все асинхронные методы имеют суффикс Async.И даже методы контроллера? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 13:18 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Shocker.ProhVosttНет, не забили. Все асинхронные методы имеют суффикс Async.И даже методы контроллера? Нет, это исключение из правила :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 13:18 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt https://stackoverflow.com/questions/18524609/configureawaitfalse-still-deadlocks Меняем на HttpClient и проблема исчезает. Вообще, от WebCliet надо уже дааааааавным давно уже было отказаться везде где только можно. Ага, понятно, спасибо! Получается, что панацеи от дедлока при синхронном вызове "какого либо" асинхронного метода не существует... Переделывать синхронные методы в асинхронные, чтобы безопасно вызывать "любые" асинхронные, тоже не всегда возможно (out-параметры и т.п.). В общем, асинхронность "кусается")) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 13:51 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRАга, понятно, спасибо! Получается, что панацеи от дедлока при синхронном вызове "какого либо" асинхронного метода не существует... Переделывать синхронные методы в асинхронные, чтобы безопасно вызывать "любые" асинхронные, тоже не всегда возможно (out-параметры и т.п.). В общем, асинхронность "кусается")) Почему? Можно, но делать надо это правильно :) Вот небольшой пример с описанием http://andrey.moveax.ru/post/csharp-sync-to-async ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 13:57 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttПочему? Можно, но делать надо это правильно :) Вот небольшой пример с описанием http://andrey.moveax.ru/post/csharp-sync-to-async Пример хороший, но несколько о другом. Речь о том, как безопасно вызывать "какой либо" асинхронный метод. Из async-метода это сделать легко - используя await. Из синхронного - сложнее, зависит от... Но, например, как в примере с дедлоком, этот синхронный метод (обработчик нажатия кнопки) легко превратить в асинхронный (дописать async) - и в нем задействовать await. Но такое легкое "превращение" не всегда возможно, в частности, если у метода есть out-параметры. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 14:24 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
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 в библиотеках, традиционно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 15:44 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
LRесли у метода есть out-параметры Запаковывать в OperationResult, как уже обсуждалось тут ранее )) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 15:45 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttLRесли у метода есть out-параметры Запаковывать в OperationResult, как уже обсуждалось тут ранее )) Не надо делать синхронный код асинхронным автоматически или волшебством дописав async. Если у вас out или у меня стек вызовов до 5го колена, то ничего не выйдет. Логику и методы надо будет переписать. Не заворачивая out в result, а полностью избавится от них. Как в java). Асинхронный код и сам программист не равен синхронному)). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 16:03 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123Не надо делать синхронный код асинхронным автоматически или волшебством дописав async. Обычно это нужно, когда асинхронные интерфейсы и синхронный код, который надо подсунуть через адаптер. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 16:30 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttОбычно это нужно, когда асинхронные интерфейсы и синхронный код, который надо подсунуть через адаптер.сложно понять постановку в одно предложение. Но вероятно что все методы уже готовы для асинхрооности)). Out,ref нету. Общения с ГУИ нету. Они без вложенности и слабозависимы от результатов.. Тогда можно и async first). Это твой термин? У меня в десктопе, кстати, не так много мест где нужна асинхронность. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2018, 16:50 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123, Всё, что потенциально работает с данными, асинхронное. Также, запросы API, работа с файлами, тоже асинхронное. В десткопе это тоже имеет смысл, но десктоп не сильно страдает от использования потоков для получения асинхронного поведения. Хотя зависит от объёма функционала и нагрузки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2018, 10:02 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, Вот смотри. Есть же другие способы в IT добится цели. В веб это контейнер или конвейер запросов. На каждый запрос конейнер выделяет новый поток. В десктопе есть ОРМ, кэш, СУБД которые делают время отклика 0,1 сек. Поэтому асинхронность методом await нужна там где нужна и в строке где поставил программист. Согласись, что бездумно пихать асинхронность например на чтение конфига нафиг нужно. Профи используют к месту и с умом). На то они и профи. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2018, 10:22 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, Поэтому я не поддерживаю сабж чтобы убрать оператор) и асинхронность first. Imho. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2018, 10:25 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123Согласись, что бездумно пихать асинхронность например на чтение конфига нафиг нужно. Если программа не может стартануть без конфига, то синхронное чтение абсолютно уместно. В ином случае, асинхронный доступ лучше, так как IO операции не детерменированы по времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2018, 10:27 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttЕсли программа не может стартануть без конфига, то синхронное чтение абсолютно уместноне понял как первое со вторым связано. Первое решается тремя способами: - конфиг это project - properties - settings - руками.....после InitializeComponent() создать если надо default конфиг - в коде учитывай что его нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2018, 12:11 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttасинхронный доступ лучше, так как IO операции не детерменированы по времени. Ты по проще для народа выражайся). Я выше писал, то профи держит под контролем IO операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2018, 12:14 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttДумаю многие сталкивались с ключевым словом await в языках, применяющих async/await паттерн для асинхронного программирования. Основное ограничение, это использование только в async-функциях, это понятно. Вопрос такой. Почему бы вообще не отказаться от этого ключевого слова и необходимости его употребления, ведь компилятор может определить наличие вызова асинхронного метода и сам выполнить его асинхронно? Понятно, что наличие ключевого слова await позволяет, допустим, собрать все вызовы в коллекцию и эвейтить её, или даже вообще не эвейтить, а выполнить без ожидания, или вернуть awaitable результат (Task, promise, etc.), но для подобного, более редкого, употребления можно было сделать специальный синтаксис. await это синтаксический сахар, тригерящий компилятор на создание стейт-машины. Вы предлагаете его убрать, чтобы компилятор автоматически распознавал, что метод возвращает Task, и в этом случае создавал стейт-машину ? Но как тогда быть, если мы хотим использовать не await а простой wait - например в консольном приложении ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:02 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВА что в GO такого легкого и простого? Ужасные горутины и каналы? Просто мерзкая обработка ошибок? И никакого ГУЯ! почему ужасные? сравнивать напрямую нельзя конечно, так как другая парадигма. кстати, в .NET тоже будут каналы, скоро. пока в глубокой бете. точнее даже не в бете а в альфе вообще 0.1.0-alpha-001 :) https://www.nuget.org/packages/System.Threading.Tasks.Channels ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:08 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
WaspNewCore, В консольном не надо асинхронность (шутка) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:45 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Petro123, Чисто консольные приложения мне не приходится писать. Но вот WinService который может запускаться в консольном режиме - для разработки и отладки - да. Вот там и получается асинхронность. Но все сводится к простому ServiceImpl.Run().Wait(). Но я просто для примера привел консольное приложение. Что предложение отказаться от старого TPL и сделать все методы с Task'ами вызываемыми с await по умолчанию, не очень наверное правильная. Думаю есть какие-то ситуации, когда осмысленно не задействовать async/await. тут вроде что-то похожее обсуждалось https://stackoverflow.com/a/24298425 со ссылками на эти статьи https://blogs.msdn.microsoft.com/pfxteam/2012/04/13/should-i-expose-synchronous-wrappers-for-asynchronous-methods/ https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/ или я сейчас ошибаюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:11 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
WaspNewCoreДумаю есть какие-то ситуации, когда осмысленно не задействовать async/await.я тоже против "автомата" в данном случае. Если бы все поддержали то и 10 страниц бы не было. Мне лично хотя бы для читабельности кода нужен оператор. Imho ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:18 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
Просто у автора темы много работы связанной с асинхронным выполнением :) у многих таких проблем нет. Это как с пропами, когда много работаешь с UI и моделями, немного раздражает эта писанина, даже с учётом сниппетов. всегда есть вещи, которые хотелось бы сделать проще. Сахара мало не бывает. Но нужно относиться к этому проще, лет 10 назад, всё это было куда большим гемороем ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:40 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
WaspNewCoreawait это синтаксический сахар, тригерящий компилятор на создание стейт-машины. Вы предлагаете его убрать, чтобы компилятор автоматически распознавал, что метод возвращает Task, и в этом случае создавал стейт-машину ? Но как тогда быть, если мы хотим использовать не await а простой wait - например в консольном приложении ? Легко. Метод помечен ключевым словом async. Этого достаточно в абсолютном большинстве случаев. И зачем в асинхронном заведомо методе "простой wait"? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:50 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
WaspNewCoreЧто предложение отказаться от старого TPL и сделать все методы с Task'ами вызываемыми с await по умолчанию, не очень наверное правильная. Я не совсем понял, как TPL кореллирует с TAP? Это немного разные вещи :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:52 |
|
Зачем нужен await?
|
|||
---|---|---|---|
#18+
hVostt, а где вы увидели эту корелляцию ? )) В общем. действительно, раз тема растянулась на 11 страниц, то значит либо мы тут чего-то не понимаем - но понимают microsoft'овцы - и не можем дать четкого ответа который бы сразу закрыл всё обсуждение. Либо действительно все оставлено "чтобы было" - мол кто хочет пользуется, кто не хочет не пользуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 10:35 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1399271]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
132ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
191ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 378ms |
0 / 0 |