|
Зачем нужен 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 |
|
|
start [/forum/topic.php?fid=20&msg=39684708&tid=1399271]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
206ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 315ms |
0 / 0 |