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

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

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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


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

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


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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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


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

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


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

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

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

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

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

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

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

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

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

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


Легко. Метод помечен ключевым словом async. Этого достаточно в абсолютном большинстве случаев. И зачем в асинхронном заведомо методе "простой wait"?
16 авг 18, 19:50    [21644971]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 8 9 [10] 11   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить