两个线程:main(GUI)和worker。工作人员要求主人使用Dispatcher.Invoke(...)
进行更新。在某些时候,由于用户干预,我必须使用Thread1.Abort()
中止工作人员。但似乎在这个序列中产生了僵局:
我知道,Abort
是邪恶的(我该怎么做?每两行插入CheckIfCanceled()
??),但假设有必要 - 我该如何防止死锁?
答案 0 :(得分:0)
在Windows线程模型中,您无法从其执行上下文外部中止线程。您应该通知工作线程退出其worker方法(然后终止线程),为此,您可以使用CancellationToken或其他交叉线程标志。 Thread.Abort()将抛出一个异常,但是当你将它与锁定多线程算法一起使用时,它并没有真正保证时间。
最好的替代方法是使用BeginInvoke()
进行调用,然后使用WaitHandle
等待答案(这会暂停线程,而不会花费CPU周期等待循环)。当主线程出席您的调用请求时,它将通过WaitHandle
发出信号,该线程可以恢复。使用标志向线程指示是否必须在恢复时退出。