2

两个线程:main (GUI) 和 worker。工人要求 main 使用Dispatcher.Invoke(...). 在某些时候,由于用户干预,我必须中止使用Thread1.Abort(). 但似乎在这个序列中创建了一个死锁:

  1. T1 调用一个动作
  2. 主线程中止 T1

在此处输入图像描述

我知道,Aborting 是邪恶的(我该怎么办?CheckIfCanceled()每两行插入一次??),但假设它是必要的 - 我怎样才能防止死锁?

4

1 回答 1

0

在 Windows 线程模型中,您不能从其执行上下文之外中止线程。您应该向工作线程发出信号以退出其工作方法(然后终止线程),为此您可以使用诸如 CancellationToken 或其他跨线程标志之类的东西。Thread.Abort() 将引发异常,但当您将其与锁定多线程算法一起使用时,并不能真正保证执行此操作的时间。

对您来说最好的选择是调用 usingBeginInvoke()并稍后使用 aWaitHandle来等待答案(这会挂起线程而无需花费 CPU 周期等待循环)。当主线程参与您的调用请求时,它将通过WaitHandle该线程发出信号可以恢复。使用标志来指示线程是否必须在恢复时退出。

于 2015-08-28T05:31:59.520 回答