|
От чего может виснуть этот код?
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=20&msg=40060938&tid=1398292]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 147ms |
0 / 0 |