Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Отмена задачи на последней итерации вешает приложение
|
|||
|---|---|---|---|
|
#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&msg=38800463&tid=1441012]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 18ms |
| total: | 174ms |

| 0 / 0 |
