Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: От чего может виснуть этот код?  [new]
Бариску Нацарство
Member

Откуда:
Сообщений: 11
felix_ff
Бариску Нацарство,

https://devblogs.microsoft.com/dotnet/configureawait-faq/


много пиндосских букв. моего мозга не хватает чтобы всё это постичь. так нужен конфигюр или не нужен?

Сообщение было отредактировано: 9 апр 21, 18:23
9 апр 21, 18:21    [22306662]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
Бариску Нацарство
Member

Откуда:
Сообщений: 11
petalvik
Бариску Нацарство,

Вот этот код ошибочен:

Правильный код:

[src c#]
private async void Form1_LoadAsync(object sender, EventArgs e)
{
    await LoadSomeEntities1();
    await LoadSomeEntities2();
    await LoadSomeEntities3();
}



Почему даже после этого методы Load...() исполняются последовательно?
В логах видно, что каждый следующий стартует только после окончания предыдущего. Разве они не должны стартовать одновременно и заканчиваться, как успеют?
9 апр 21, 18:34    [22306668]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
fkthat
Member

Откуда:
Сообщений: 4880
Бариску Нацарство
Почему даже после этого методы Load...() исполняются последовательно?

ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await?

Я еще раз говорю - погугль, почитай доки и т.п. чтобы разобраться для чего вообще ConfigureAwait нужен.
+
подсказка - можешь сразу просто гуглить что такое synchronization context
9 апр 21, 19:28    [22306707]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
hVostt
Member

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


Не нужен.
9 апр 21, 19:56    [22306730]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
fkthat
Member

Откуда:
Сообщений: 4880
hVostt
Не нужен.

Вообще-то нужен когда х/з что и как будет твой код вызывать. Линтеры так-то на его отсутствие ворчат. Я обычно просто из-за этого пишу, хотя лично мне-то он как раз вообще пофиг, т.к. работаю только с ASP.NET Core.
9 апр 21, 20:05    [22306736]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22381
Бариску Нацарство
так нужен конфигюр или не нужен?
Блин, зависит от способа использования. В случае неиспользования в одном случае - дедлок, в случае использования - в другом случае - проблемы с контекстом синхронизации. Как это объяснить в двух словах, если ты за пять лет не смог в этом разобраться (даже в await)? Не получается учебник на английском - возьми перевод - Троелсен, Албахари и т.п., везде разжевывается многопоточность и с чем ее едят, что такое таски, что такое аваиты и т.п.
Бариску Нацарство
Я 5 лет работал в компании, где, в соответствии утверждениям Скита, .ConfigureAwait(false) висел на каждом await, и мои пулл реквесты не одобряли, пока я не добавлял их.
Ну так может вы писали код там, где не было контекста синхронизации. Ты выдернул проблематику из контекста и пытаешься теперь везде ее пихать, да еще прикрываешь своё незнание ссылкой на авторитеты.
9 апр 21, 21:03    [22306760]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
Бариску Нацарство
Member

Откуда:
Сообщений: 11
fkthat
ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await?


а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется?
гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно.
9 апр 21, 21:35    [22306772]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22381
Бариску Нацарство
а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется?
гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно.
О боже. Знания о многопоточности даже не на уровне юниора.
Будешь читать учебник, заодно посмотри, чем отличается асинхронность от многопоточности.
За книжки бегом!

Сообщение было отредактировано: 9 апр 21, 21:47
9 апр 21, 21:54    [22306776]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
hVostt
Member

Откуда:
Сообщений: 19318
fkthat
hVostt
Не нужен.

Вообще-то нужен когда х/з что и как будет твой код вызывать. Линтеры так-то на его отсутствие ворчат. Я обычно просто из-за этого пишу, хотя лично мне-то он как раз вообще пофиг, т.к. работаю только с ASP.NET Core.


Ток для библиотек. Можно даже Fody настроить, чтобы автоматом добавлял.
9 апр 21, 22:35    [22306795]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
hVostt
Member

Откуда:
Сообщений: 19318
Бариску Нацарство
а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется?
гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно.


Ну вот и используйте Task.Run().
Главное чтобы вас лично всё устраивало.
9 апр 21, 22:36    [22306796]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
fkthat
Member

Откуда:
Сообщений: 4880
hVostt
Ток для библиотек.

Ну да, я это и имел в виду под "х/з кто будет вызывать".

hVostt
Можно даже Fody настроить, чтобы автоматом добавлял.

Так даже студия это умеет по "Ctrl+точка".
9 апр 21, 22:38    [22306798]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
fkthat
Member

Откуда:
Сообщений: 4880
hVostt
Ну вот и используйте Task.Run().

Судя по тому что пишет автор, представляю что это будет :))
9 апр 21, 22:40    [22306800]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
hVostt
Member

Откуда:
Сообщений: 19318
fkthat
Так даже студия это умеет по "Ctrl+точка".


Fody немного иначе работает, он модифицирует dll, добавляя туда вызовы для каждого await.
9 апр 21, 22:41    [22306801]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
hVostt
Member

Откуда:
Сообщений: 19318
fkthat
hVostt
Ну вот и используйте Task.Run().

Судя по тому что пишет автор, представляю что это будет :))


Будет очередной легаси :)
9 апр 21, 22:51    [22306803]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6192
fkthat
Бариску Нацарство
Почему даже после этого методы Load...() исполняются последовательно?

ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await?

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

Не. Тут сначала нужно читать про то, как вообще await устроен и действует. Налицо факт полного непонимания основных концепций этой фичи.
10 апр 21, 03:46    [22306873]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
petalvik
Member

Откуда:
Сообщений: 712
Бариску Нацарство

private async void Form1_LoadAsync(object sender, EventArgs e)
{
    await LoadSomeEntities1();
    await LoadSomeEntities2();
    await LoadSomeEntities3();
}


Почему даже после этого методы Load...() исполняются последовательно?


Потому что перед каждым стоит await.

Так они будут выполняться одновременно:

private async void Form1_LoadAsync(object sender, EventArgs e)
{
    var t1 = LoadSomeEntities1();
    var t2 = LoadSomeEntities2();
    var t3 = LoadSomeEntities3();
    await Task.WhenAll(t1, t2, t3);
}

Но это если они не обращаются к одним и тем же объектам. Конкуррентный доступ, все дела...

Бариску Нацарство

а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется?
гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно.


Вызов await LoadSomeEntities1(); не подвешивает текущий поток. Например, GUI продолжает отрисовываться и реагировать на действия пользователя.
10 май 21, 08:44    [22320008]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
petalvik
Member

Откуда:
Сообщений: 712
Попробую объяснить простыми словами, зачем всё-таки нужен ConfigureAwait.

Когда мы пишем вот так:

await ReadEntitesFromDB();
// или так
await ReadEntitesFromDB().ConfigureAwait(true);


То перед вызовом этого метода захватывается контекст. А после его окончания выполнение возвращается в этот же контекст. Грубо говоря, в тот же поток.
Но этот поток может быть занят какой-то другой задачей. Например, поток GUI может делать отрисовку в событии Paint. Поэтому может быть существенная задержка - ожидание освобождения потока.

А если мы напишем так:

await ReadEntitesFromDB().ConfigureAwait(false);

То после окончания выполнения метода продолжение может быть сделано в любом свободном на этот момент потоке.
Поэтому использование ConfigureAwait(false) в целом ускоряет выполнение, устраняя лишние ожидания.

Поэтому в библиотечном коде рекомендуется практически всегда использовать именно false.

Однако в коде приложения не всегда можно продолжить выполнение в другом потоке.
В частности, если нужно обратиться к контролам формы (TreeView). Обращаться к ним можно только из того потока, в котором они были созданы. Поэтому без ConfigureAwait(false) придётся использовать Invoke. А с ним этого не нужно - мы гарантированно вернулись в нужный поток.
10 май 21, 08:55    [22320011]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4206
дело не в потоках, а контексте выполнения/синхронизации, забудь слово потоки

Сообщение было отредактировано: 10 май 21, 10:40
10 май 21, 10:48    [22320043]     Ответить | Цитировать Сообщить модератору
 Re: От чего может виснуть этот код?  [new]
petalvik
Member

Откуда:
Сообщений: 712
Roman Mejtes
дело не в потоках, а контексте выполнения/синхронизации, забудь слово потоки


Наоборот. Всё дело в потоках.
Консольные приложения никогда не имели контекста синхронизации. В ASP.NET Core SynchronizationContext тоже выпилили. Так куда возвращается выполнение после завершения асинхронного кода?
11 май 21, 15:58    [22320521]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / WinForms, .Net Framework Ответить