gpt4 book ai didi

c# - 检查线程是否在 "killing"之前完成其方法 c#

转载 作者:太空狗 更新时间:2023-10-30 00:14:26 24 4
gpt4 key购买 nike

我的程序中有 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 进入和离开一个方法时设置,但这对我来说似乎不正确。我的意思是我认为必须有更简单的方法来处理它。

最佳答案

However if I kill the WorkerThread while it's in the middle of a method it sometimes causes a problem in my word document

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

Abort 没有按照您的预期进行。看documentation , 这是微妙的调用此方法通常终止线程。请注意通常和不总是这个词。

是的,Abort 不会一直终止线程。例如,如果线程正在运行非托管代码,CLR 将不会中止线程,而是等待线程返回托管代码。

Sameway Abort 不会在线程处于 Constrained Execution Region 时执行其工作, finally block 等等。

The CLR delays thread aborts for code that is executing in a 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 .

关于c# - 检查线程是否在 "killing"之前完成其方法 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27561976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com