|
Отмена задачи на последней итерации вешает приложение
|
|||
---|---|---|---|
#18+
Есть приложение, в нем запущена задача в фоне, в задаче цикл. Если задачу отменить на любой итерации цикла кроме последней - все ок. Если отменить на последней итерации - приложение зависнет на строке _myTask.Wait(); . Как я полагаю, это происходит из-за того, что сигнал отмены прилетает уже после того как в фоновом потоке будут пройдены строки Код: c# 1. 2.
и тут что-то видимо идет не так. Прилагаю код, чтоб было понятнее, что происходит, но данный код, к сожалению, НЕ ВОСПРОИЗВОДИТ баг. По непонятным причинам, не воспроизводит и все, хотя я в точности (как мне кажется) сэмулировал то, что происходит в реальном проекте. Может быть есть какие-то соображения, что это может быть? .Xaml Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
.cs Код: 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. 71. 72. 73.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2014, 10:26 |
|
Отмена задачи на последней итерации вешает приложение
|
|||
---|---|---|---|
#18+
Нашел как стопроцентно эмулировать баг. Добавляем в приложение таймер. Код: c# 1.
Код: c# 1.
В конструторе пишем Код: c# 1. 2.
Самое главное в методе. Код: 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.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
В принципе, замена Application.Current.Dispatcher.Invoke на Application.Current.Dispatcher.BeginInvoke лечит ситуацию. Похоже, соль в следующем: _myTask.Wait(); вешает основной поток, ждет, когда задача завершится. Если итерация не последняя, то на следующей итерации сработают строки Код: c# 1. 2.
Будет исключение и выход из задачи, до строки с таймером код не дойдет. А на последней итерации отмены задачи не произойдет, она будет завершаться в штатном режиме, дойдет до строки с таймером и там будет пытаться у ожидающего потока вызвать метод. Дедлок. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2014, 11:22 |
|
|
start [/forum/topic.php?fid=21&fpage=20&tid=1441012]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 23ms |
total: | 180ms |
0 / 0 |