我的程序中有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) ;
我自己的问题建议/解决方法是每次WorkerThread输入并留下一个方法时都可以设置一个全局变量,但这对我来说似乎不对。我的意思是我认为必须有一种更简单的方法来处理它。
答案 0 :(得分:11)
但是,如果我在方法中间杀死WorkerThread,它有时会导致我的word文档出现问题
这就是为什么你永远不应该杀死一个线程。你不能说线程在做什么,是否可以安全杀死?等等。
Abort
没有做你期望它做的事情。查看documentation,它是微妙的调用此方法通常终止线程。请注意这个词通常而不是总是。
是的,Abort
不会永远杀死该主题。例如,如果线程正在运行非托管代码,CLR将不会中止该线程,而是等待线程返回托管代码。
Abort
将无法正常工作,最后阻塞等。
CLR延迟了在CER中执行的代码的线程中止。
例如:尝试运行以下代码,看看会发生什么。
private void IWillNeverReturn()
{
Thread thread = new Thread(() =>
{
try
{
}
finally
{
while (true)
{ }
}
});
thread.Start();
Thread.Sleep(1000);
thread.Abort();
}
让线程决定何时完成,告诉线程它应该尽快停止。你用CancellationToken告诉它。
如果你谷歌搜索 Thread.Abort Evil ,你会发现很多有用的资源,Here is one。