Два потока: основной (GUI) и рабочий. Работник просит обновить основное, используя Dispatcher.Invoke(...)
. В какой-то момент, в результате вмешательства пользователя, я должен прервать работника, используя Thread1.Abort()
. Но тупик, кажется, создается в этой последовательности:Thread.Abort() создает тупик при вызове рабочего потока Dispatcher.Invoke()
- T1 вызывает для действия
- основного потока прерывается T1
Я знаю, Abort
динг является злом (что должен ли я вставлять CheckIfCanceled()
каждые две строки?), но при условии, что это необходимо - как я могу предотвратить тупик?
Пункт использования Dispatcher.Invoke() вместо Dispatcher.BeginInvoke() заключается в том, что вы можете использовать его возвращаемое значение. И вы можете выбросить исключение и поймать его в потоке. Это дает вам два отличных способа остановить поток, не прерывая его. –
Вам действительно нужно немедленно прекратить поток? Не можете ли вы просто проверить «IsCancellationRequested» один раз (или несколько раз) в первичном цикле потока? – svick
@ HansPassant, я не понимаю, в чем ваш смысл. Как я могу остановить поток таким образом? У меня длинный рабочий поток, он время от времени запрашивает GUI для вызова, как это может мне помочь? – Tar