Thread.Abort()在工作线程调用Dispatcher.Invoke()时创建死锁

时间:2013-09-15 17:35:22

标签: c# multithreading deadlock

两个线程:main(GUI)和worker。工作人员要求主人使用Dispatcher.Invoke(...)进行更新。在某些时候,由于用户干预,我必须使用Thread1.Abort()中止工作人员。但似乎在这个序列中产生了僵局:

  1. T1调用操作
  2. 主线程中止T1
  3. enter image description here

    我知道,Abort是邪恶的(我该怎么做?每两行插入CheckIfCanceled() ??),但假设有必要 - 我该如何防止死锁?

1 个答案:

答案 0 :(得分:0)

在Windows线程模型中,您无法从其执行上下文外部中止线程。您应该通知工作线程退出其worker方法(然后终止线程),为此,您可以使用CancellationToken或其他交叉线程标志。 Thread.Abort()将抛出一个异常,但是当你将它与锁定多线程算法一起使用时,它并没有真正保证时间。

最好的替代方法是使用BeginInvoke()进行调用,然后使用WaitHandle等待答案(这会暂停线程,而不会花费CPU周期等待循环)。当主线程出席您的调用请求时,它将通过WaitHandle发出信号,该线程可以恢复。使用标志向线程指示是否必须在恢复时退出。