C#Threads.Abort()

如果一个线程正在运行一个函数func1 ,它调用其中的另一个函数func2

然后我调用了thread.Abort()

这会停止func1
或者func1func2以及所有函数func1都调用了?

谢谢

编辑:以下是更多细节:

func1在新线程中调用,它会定期连续调用func2
func2只有在某些数组不为空时才开始做一些工作..它完成并返回

当主管想要保存数据时,它会中止Thread of func1 – 然后使数组为null,保存数据,然后用新的数据填充数组..然后再次使用func1启动Thread。

有时会引发exception,因为func2数组为空。所以func1 abort不会影响func2

Thread.Abort不保证会停止线程,如果可能的话你应该避免使用它。

调用此方法通常会终止该线程。

强调我的。

它的作用是在目标线程中引发ThreadAbortException 。 如果捕获此exception,代码将继续执行,直到它到达catch块的末尾,此时exception将自动重新抛出。 如果你没有捕获它,它类似于正常的exception – 它向上传播调用堆栈。

假设您没有捕获exception,那么该线程中运行的所有代码都将停止运行。 从该线程启动的其他线程不会受到影响。

在该线程内启动的任何内容都将被中止。

您可能面临竞争条件,其中您的主例程在ThreadAbortException到达func1线程之前但在func2检查空数组之后使数组为空。

至少,你的主代码和func2应该在数组周围使用锁。 您还应该在再次重新启动之前测试func1线程是否已死。 正如其他人所说,发出一个线程停止而不是依赖Thread.Abort。

我不是100%肯定你的描述func2是从func1线程中调用的,但是如果func2是在func1中启动的另一个线程上运行的,那么杀死func1线程不会影响func2,因为所有线程都存在为子节点您的父进程,而不是它们从它们启动的线程。

关心谁:
经过更多调试后,我发现线程在启动之前再次初始化; 导致线程在后台运行…

  Thread T T=new Thread(func1); // Some code... // Start: T=new Thread(func1); 

在后台这个未引用的一个不受Abort()的影响…所以它将继续工作并尝试使用null数组…

在末尾:
Abort()将结束你的线程,除了在某些条件下(在上面的其他答案中提到)
Abort()在被引用后不会结束一个线程(显然)

谢谢!!