在"杀死"c#之前检查线程是否完成了它的方法

n.S*_*ang 4 c# multithreading terminate

我的程序中有2个线程.1是处理GUI而另一个是进行一些文字自动化.让我们称他们为GUIThread和WorkerThread.

WorkerThread使用递归循环遍历方法.在执行自动化一词时,WorkerThread只能处于活动状态,用户必须能够停止自动化一词.因此,我在GUI上实现了一个"停止"按钮,它只是杀死/终止WorkerThread.但是,如果我在方法中间杀死WorkerThread,它有时会导致我的word文档出现问题(这是一个较长的故事),这就是为什么我要在检查之前检查WorkerThread是否已从方法完成/返回它.

当我点击"停止"按钮时,这就是我的代码所做的事情:

//Stops the worker thread = stops word automation in process
workerThread.Abort();

//This blocks the thread until the workerThread has aborted
while (workerThread.IsAlive) ;
Run Code Online (Sandbox Code Playgroud)

我自己对这个问题的建议/解决方法是有一个全局变量,我可以在每次输入WorkerThread时设置并留下一个方法,但这对我来说似乎不对.我的意思是我认为必须有一种更简单的方法来处理它.

Sri*_*vel 11

但是,如果我在方法中间杀死WorkerThread,它有时会导致我的word文档出现问题

这就是为什么你永远不应该杀死一个线程.你不能说线程在做什么,是否可以安全杀死?等等

Abort没有做你期望它做的事情.看一下文档,它很微妙调用这个方法通常会终止线程.注意这个词通常而不是总是.

是的,Abort不会永远杀死线程.例如,如果线程正在运行非托管代码,CLR将不会中止该线程,而是等待线程返回托管代码.

Abort当线程处于约束执行区域,最后阻塞等时,Sameway 将无法完成其工作.

CLR延迟了在CER中执行的代码的线程中止.

例如:尝试运行以下代码,看看会发生什么.

private void IWillNeverReturn()
{
    Thread thread = new Thread(() =>
    {
        try
        {
        }
        finally
        {
            while (true)
            { }
        }
    });
    thread.Start();

    Thread.Sleep(1000);
    thread.Abort();
}
Run Code Online (Sandbox Code Playgroud)

让线程决定何时完成,告诉线程它应该尽快停止.你用CancellationToken告诉它.

如果你谷歌为Thread.Abort Evil,你会发现很多有用的资源,这是一个.