|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Примерно так: В form_Load: Код: c# 1. 2. 3. 4. 5. 6.
Форма загружается, всё отрабатывает, всё загружено. Никаких проблем! В combobox_selectedIndexChanged: Код: c# 1.
А в самой функции: Код: 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.
Но стоит сменить значение комбобокса, как тот же самый код виснет на входе в делегат. Чем отличается вызов этого кода при пользовательском вводе от вызова при загрузке формы? В обоих случаях InvokeRequired = true, соответственно всегда отрабатывает делегат. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 20:39 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство Код: c# 1.
потому что так делать нельзя, объяснять долго, нудно, всё это можно найти и почитать в документации. непонятно зачем так делаете, это просто эксперименты? https://stackoverflow.com/questions/5095183/how-would-i-run-an-async-taskt-method-synchronously ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 21:45 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
что значит нельзя? так делают все и везде. в чём конкретно претензия? и зачем мне ссылка на синхронное исполнение асинхронного вызова? синхронно-то оно и так работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 23:08 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство что значит нельзя? то и значит. Бариску Нацарство так делают все и везде. в чём конкретно претензия? Код: c# 1. 2. 3. 4. 5. 6.
так даже в дремучем колхозе делать моветон. Бариску Нацарство и зачем мне ссылка на синхронное исполнение асинхронного вызова? синхронно-то оно и так работает. у вас асинхронный метод Код: c# 1.
зачем вы в этом методе асинхронный метод пытаетесь вызвать "синхронно"? Код: c# 1.
зачем убирать await и добавлять GetResult()? это во-первых неправильно, что как бы подтверждается тем, что "виснет", во-вторых.. зачем? это для чего? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 23:23 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство, и зачем вы везде .ConfigureAwait(false) добавляете? при чём там, где как раз этого делать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 23:24 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство, Код: c# 1. 2. 3. 4. 5. 6.
Не нужно их оборачивать в Task и запускать синхронно. При желании, можно написать так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Так все три метода будут выполняться одновременно, то есть общее выполнение будет быстрее. Но это если они не обращаются к одним и тем же объектам. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
И это всё! Суть и красота асинхронности заключена в лаконичности, которую она позволяет. Код: c# 1. 2. 3. 4.
Ничего не виснет, всё летает! ЗЫ: у обработчиков событий в сигнатуре должно быть async. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 23:58 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
petalvik ЗЫ: у обработчиков событий в сигнатуре должно быть async. да, void async-и поддержали только ради событий WinForms ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 01:39 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Джон Скит из МС утверждает везде что на каждом асинхронном вызове должен висеть .ConfigureAwait(false). Вы утверждаете, что это делает вызов синхронным. И кому верить? > зачем убирать await и добавлять GetResult()? это во-первых неправильно, что как бы подтверждается тем, что "виснет", во-вторых.. зачем? это для чего? чтобы не висло. Вы, кажется, всё перепутали: как "неправильно" не виснет. Как сейчас виснет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 15:35 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
petalvik Бариску Нацарство, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
И это всё! Суть и красота асинхронности заключена в лаконичности, которую она позволяет. ЗЫ: у обработчиков событий в сигнатуре должно быть async. Сделал всё, как Вы советуете выше. Вроде бы всё работает, только две проблемы остались: await ReadEntitesFromDB(); виснет, если не добавить .ConfigureAwait(false) и всё-таки добавление нод в trvTreeView по-прежнему бросает исключение об обращении из другой нити, если не оставить .Invoke((MethodDelegate) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 16:22 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство, Вот этот код ошибочен: Код: c# 1. 2. 3. 4. 5. 6.
Здесь нужно убрать .ConfigureAwait(false). Потому что в этих методах происходит обращение к GUI-контролам. Правильный код: Код: c# 1. 2. 3. 4. 5. 6.
Теперь не будет бросать исключение. Бариску Нацарство await ReadEntitesFromDB(); виснет, если не добавить .ConfigureAwait(false) Значит код в методе ReadEntitesFromDB() написан неправильно. Наверняка там тоже присобачено .GetAwaiter().GetResult() или что-то ещё. Покажи код. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 16:37 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство, И ещё. Вызовы trvTreeView.SuspendLayout(); и trvTreeView.ResumeLayout(); не нужны. Если, конечно, в тривью не добавляются дочерние контролы вызовом trvTreeView.Controls.Add(...); ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 16:43 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
petalvik Бариску Нацарство, Вот этот код ошибочен: Спасибо, всё почистил, всё работает. Объяснил бы ещё кто зачем тот самый Джон Скит везде пугает не использовать async void и настаивает чтобы на каждом await висел .ConfigureAwait(false). Я поначалу делал именно как Вы советуете, но меня затроллили и много лет заставляли добавлять .ConfigureAwait(false). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 23:04 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство Объяснил бы ещё кто зачем тот самый Джон Скит везде пугает не использовать async void и настаивает чтобы на каждом await висел .ConfigureAwait(false). Я поначалу делал именно как Вы советуете, но меня затроллили и много лет заставляли добавлять .ConfigureAwait(false). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 23:19 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
hVostt да, void async-и поддержали только ради событий WinForms Почему это? События есть не только в винформс, а много ещё где - в т.ч. в областях, вообще никак не связанных с GUI: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 06:38 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
ТС ссылку-то не дал, а Джон Скит наверняка имел ввиду - не плодить собственные сигнатуры с async void. А от легаси никуда не денешься, потому это исключение. Да и про ConfugureAwait наверняка указывал те случаи, когда его нельзя применять. Но зачем вникать в детали - давай везде пихать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 09:35 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство Джон Скит из МС утверждает везде что на каждом асинхронном вызове должен висеть .ConfigureAwait(false). Вы утверждаете, что это делает вызов синхронным. И кому верить? ничего он такого не утверждает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 10:13 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны Почему это? События есть не только в винформс, а много ещё где - в т.ч. в областях, вообще никак не связанных с GUI: за пределами WinForms события лучше не использовать. и вообще забыть про них как про страшный сон. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 10:14 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Shocker.Pro ТС ссылку-то не дал, а Джон Скит наверняка имел ввиду - не плодить собственные сигнатуры с async void. Об этом пишет не только Скит (который, кстати говоря, давно уже в гугле работает). Вот, например: https://docs.microsoft.com/en-us/archive/blogs/ptorr/async-exceptions-in-c Причина достаточно банальна: void не содержит информации о контексте выполнения задачи, т.к. это void. И поэтому с void есть вот такое: Код: 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.
Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 10:25 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
hVostt за пределами WinForms события лучше не использовать. и вообще забыть про них как про страшный сон. Интересно, как это можно реализовать, например, в случае SqlConnection.InfoMessage (таких примеров можно привести много) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 10:31 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны Интересно, как это можно реализовать, например, в случае SqlConnection.InfoMessage (таких примеров можно привести много) Согласен, есть легаси контракты, которые до сих пор поддерживаются. От этих эвентов нужно максимально абстрагироваться и декорировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 10:56 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
hVostt Бариску Нацарство Джон Скит из МС утверждает везде что на каждом асинхронном вызове должен висеть .ConfigureAwait(false). Вы утверждаете, что это делает вызов синхронным. И кому верить? ничего он такого не утверждает. Он именно так и утверждает в каждом из его 1000ч постов, которые он плодит на стэкэксчендже и в каждом ссылается на свои блог посты. Везде одно и то же: вешайте .ConfigureAwait(false) на каждый await чтобы не было дедлоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:21 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Shocker.Pro А не проще ли взять учебник и прочесть А какой учебник? Я 5 лет работал в компании, где, в соответствии утверждениям Скита, .ConfigureAwait(false) висел на каждом await, и мои пулл реквесты не одобряли, пока я не добавлял их. Объяснить, зачем они это требуют, правда тоже не могли. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:24 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство Везде одно и то же: вешайте .ConfigureAwait(false) на каждый await чтобы не было дедлоков. Блин, а просто самому прочтитать доки о том, что делает .ConfigureAwait(...) сложно, что ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 14:47 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
fkthat Бариску Нацарство Везде одно и то же: вешайте .ConfigureAwait(false) на каждый await чтобы не было дедлоков. Блин, а просто самому прочтитать доки о том, что делает .ConfigureAwait(...) сложно, что ли? Configures the awaiter to await this Task<TResult>. true to attempt to marshal the continuation back to the original context captured; otherwise, false. И что это мне должно сказать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 17:40 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
felix_ff много пиндосских букв. моего мозга не хватает чтобы всё это постичь. так нужен конфигюр или не нужен? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 18:21 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
petalvik Бариску Нацарство, Вот этот код ошибочен: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Почему даже после этого методы Load...() исполняются последовательно? В логах видно, что каждый следующий стартует только после окончания предыдущего. Разве они не должны стартовать одновременно и заканчиваться, как успеют? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 18:34 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство Почему даже после этого методы Load...() исполняются последовательно? ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await? Я еще раз говорю - погугль, почитай доки и т.п. чтобы разобраться для чего вообще ConfigureAwait нужен. подсказка - можешь сразу просто гуглить что такое synchronization context ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 19:28 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство много пиндосских букв. моего мозга не хватает чтобы всё это постичь. так нужен конфигюр или не нужен? Не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 19:56 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
hVostt Не нужен. Вообще-то нужен когда х/з что и как будет твой код вызывать. Линтеры так-то на его отсутствие ворчат. Я обычно просто из-за этого пишу, хотя лично мне-то он как раз вообще пофиг, т.к. работаю только с ASP.NET Core. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 20:05 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство так нужен конфигюр или не нужен? Бариску Нацарство Я 5 лет работал в компании, где, в соответствии утверждениям Скита, .ConfigureAwait(false) висел на каждом await, и мои пулл реквесты не одобряли, пока я не добавлял их. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:03 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
fkthat ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await? а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется? гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:35 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется? гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно. Будешь читать учебник, заодно посмотри, чем отличается асинхронность от многопоточности. За книжки бегом! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:54 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
fkthat hVostt Не нужен. Вообще-то нужен когда х/з что и как будет твой код вызывать. Линтеры так-то на его отсутствие ворчат. Я обычно просто из-за этого пишу, хотя лично мне-то он как раз вообще пофиг, т.к. работаю только с ASP.NET Core. Ток для библиотек. Можно даже Fody настроить, чтобы автоматом добавлял. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:35 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется? гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно. Ну вот и используйте Task.Run(). Главное чтобы вас лично всё устраивало. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:36 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
hVostt Ток для библиотек. Ну да, я это и имел в виду под "х/з кто будет вызывать". hVostt Можно даже Fody настроить, чтобы автоматом добавлял. Так даже студия это умеет по "Ctrl+точка". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:38 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
hVostt Ну вот и используйте Task.Run(). Судя по тому что пишет автор, представляю что это будет :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:40 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
fkthat Так даже студия это умеет по "Ctrl+точка". Fody немного иначе работает, он модифицирует dll, добавляя туда вызовы для каждого await. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:41 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
fkthat hVostt Ну вот и используйте Task.Run(). Судя по тому что пишет автор, представляю что это будет :)) Будет очередной легаси :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:51 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
fkthat Бариску Нацарство Почему даже после этого методы Load...() исполняются последовательно? ОМГ, а как же они еще должны выполняться по-твоему, если перед каждым стоит await? Я еще раз говорю - погугль, почитай доки и т.п. чтобы разобраться для чего вообще ConfigureAwait нужен. Не. Тут сначала нужно читать про то, как вообще await устроен и действует. Налицо факт полного непонимания основных концепций этой фичи. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 03:46 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Бариску Нацарство Код: c# 1. 2. 3. 4. 5. 6.
Почему даже после этого методы Load...() исполняются последовательно? Потому что перед каждым стоит await. Так они будут выполняться одновременно: Код: c# 1. 2. 3. 4. 5. 6. 7.
Но это если они не обращаются к одним и тем же объектам. Конкуррентный доступ, все дела... Бариску Нацарство а зачем тогда нужны эти async и его await, если всё равно как выполнялось синхронно, так и выполняется? гораздо проще старые, проверенные Task.Run(). Они-то по крайней мере точно выполняются параллельно. Вызов await LoadSomeEntities1(); не подвешивает текущий поток. Например, GUI продолжает отрисовываться и реагировать на действия пользователя. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2021, 08:44 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Попробую объяснить простыми словами, зачем всё-таки нужен ConfigureAwait. Когда мы пишем вот так: Код: c# 1. 2. 3.
То перед вызовом этого метода захватывается контекст. А после его окончания выполнение возвращается в этот же контекст. Грубо говоря, в тот же поток. Но этот поток может быть занят какой-то другой задачей. Например, поток GUI может делать отрисовку в событии Paint. Поэтому может быть существенная задержка - ожидание освобождения потока. А если мы напишем так: Код: c# 1.
То после окончания выполнения метода продолжение может быть сделано в любом свободном на этот момент потоке. Поэтому использование ConfigureAwait(false) в целом ускоряет выполнение, устраняя лишние ожидания. Поэтому в библиотечном коде рекомендуется практически всегда использовать именно false. Однако в коде приложения не всегда можно продолжить выполнение в другом потоке. В частности, если нужно обратиться к контролам формы (TreeView). Обращаться к ним можно только из того потока, в котором они были созданы. Поэтому без ConfigureAwait(false) придётся использовать Invoke. А с ним этого не нужно - мы гарантированно вернулись в нужный поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2021, 08:55 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
дело не в потоках, а контексте выполнения/синхронизации, забудь слово потоки ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2021, 10:48 |
|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#18+
Roman Mejtes дело не в потоках, а контексте выполнения/синхронизации, забудь слово потоки Наоборот. Всё дело в потоках. Консольные приложения никогда не имели контекста синхронизации. В ASP.NET Core SynchronizationContext тоже выпилили. Так куда возвращается выполнение после завершения асинхронного кода? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2021, 15:58 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1398292]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 193ms |
0 / 0 |