|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Вот такой вот парадокс обнаружил. SleepBeforeInvoke - вешает интерфейс, два остальных метода не вешают, т.е. задача отменяется корректно, попадаем в catch . Кто может объяснить в чем прикол? Win7, .Net 4.0 Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 11:32 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
monstrillaВот такой вот парадокс обнаружил. SleepBeforeInvoke - вешает интерфейсПотому что мёртвая блокировка. Application.Current.Dispatcher.Invoke ждёт завершения ButtonBase_OnClick _task.Wait() ждёт завершения SleepBeforeInvoke Вообще, Dispatcher.Invoke лучше не использовать без особых на то причин. Надо использовать Dispatcher.BeginInvoke. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 15:44 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Алексей К, но ведь SleepAfterInvoke работает. а разница только в последовательности вызова Thread.Sleep.... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 16:21 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
monstrillaАлексей К, но ведь SleepAfterInvoke работает. а разница только в последовательности вызова Thread.Sleep....Там ещё различия Invoke vs BeginInvoke ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 16:24 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Алексей К, нет SleepBeforeInvoke авторThread.Sleep(500); Application.Current.Dispatcher.Invoke(new Action(() => { })); SleepAfterInvoke авторApplication.Current.Dispatcher.Invoke(new Action(() => { })); Thread.Sleep(500); ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 16:29 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
monstrillaАлексей К, нет SleepBeforeInvoke авторThread.Sleep(500); Application.Current.Dispatcher.Invoke(new Action(() => { })); SleepAfterInvoke авторApplication.Current.Dispatcher.Invoke(new Action(() => { })); Thread.Sleep(500); Согласен, перепутал. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 16:44 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Мёртвая блокировка. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Но существует и вероятность того, что SleepAfterInvoke тоже повиснет, если: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 16:53 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Алексей К, я что-то не пойму, разве строка Код: c# 1.
не кидает исключение и не инициирует мгновенный возврат из метода? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 17:17 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
и вообще, если поток подвешивает строка Код: c# 1.
то почему все работает без Thread.Sleep(500); ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 17:21 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
monstrillaАлексей К, я что-то не пойму, разве строка Код: c# 1.
не кидает исключение и не инициирует мгновенный возврат из метода?Отмена обычно выпадает на Thread.Sleep. Между Thread.Sleep и _cts.Token.ThrowIfCancellationRequested находится Dispatcher.Invoke, от которого все беды. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 17:22 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
monstrillaи вообще, если поток подвешивает строка Код: c# 1.
то почему все работает без Thread.Sleep(500); Просто везёт пока. Вероятность мёртвой блокировки существует. Я же не зря посоветовал всегда использовать BeginInvoke. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 17:23 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Алексей К, да я так и сделал, просто пытаюсь докопаться до сути. не люблю без понимания делать. честно говоря, понятнее не стало. непонятно кто кого ждет, почему не кидается исключение, почему строка Код: c# 1.
вообще не отрабатывает :( если можете подробнее расписать - буду признателен. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 17:29 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
monstrillaАлексей К, да я так и сделал, просто пытаюсь докопаться до сути. не люблю без понимания делать. честно говоря, понятнее не стало. непонятно кто кого ждет, почему не кидается исключение, почему строка Код: c# 1.
вообще не отрабатывает :( если можете подробнее расписать - буду признателен.Код в buttonClick ждёт пока завершится таск [_task.Wait()] и Таск ждёт пока завершится buttonClick [Dispatcher.Invoke()] ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 17:53 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Алексей К, я, конечно, с одной стороны понимаю, что у меня две операции запускаются синхронно в потоке UI и, по идее это и ведет к блокировке (но при таком сценарии блокировка должна быть стопроцентной, т.е. проявляться всегда , независимо от того, что там еще есть в теле цикла). но тогда возвращаемся к вопросу, почему она не проявляется, если Thread.Sleep() отсутствует или расположен после Invoke() . не понятно, что значит пока везет *тут смайлик, который головой об стену бьется ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 18:01 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
monstrillaпочему она не проявляется, если Thread.Sleep() отсутствует или расположен после Invoke() . не понятно, что значит пока везет Она появляется, но намного реже. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 18:02 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Алексей Кmonstrillaпочему она не проявляется, если Thread.Sleep() отсутствует или расположен после Invoke() . не понятно, что значит пока везет Она появляется, но намного реже.Настолько же реже SleepBeforeInvoke работает без блокировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2014, 18:04 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
Алексей К, в этом то и вопрос, какова закономерность. почему блокировка не перманентная, а проявляется как то рандомно. как программить то, если невозможно точно сказать будет код работать или нет ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2014, 08:59 |
|
Отмена задачи вешает UI намертво
|
|||
---|---|---|---|
#18+
monstrillaАлексей К, в этом то и вопрос, какова закономерность. почему блокировка не перманентная, а проявляется как то рандомно. как программить то, если невозможно точно сказать будет код работать или нетПотому что отмена почти всегда выпадает на Thread.Sleep(500) , по понятным причинам. Поэтому положение Thread.Sleep(500) сильно влияет на ситуацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2014, 17:45 |
|
|
start [/forum/topic.php?fid=21&fpage=21&tid=1441048]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 150ms |
0 / 0 |