7

如果一个线程正在运行一个函数,该函数func1调用func2它内部的另一个函数......

然后我打电话给 thread.Abort()

func1这只会停止
OR func1并且func2所有函数func1都调用了吗?

谢谢

编辑:这里有更多细节:

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

当主管要保存数据时,它会中止func1- 的线程,然后使数组为空,保存数据,然后用新的数组填充数组..并func1再次启动线程..

有时会引发异常,因为func2.. 中的数组为空,所以 func1 中止不会影响 func2

4

4 回答 4

14

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

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

强调我的。

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

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

于 2010-05-24T20:21:55.577 回答
3

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

于 2010-05-24T20:15:50.070 回答
0

对于谁在乎:
经过更多调试,我发现线程在开始之前再次初始化;导致线程在后台运行...

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

后台中这个未引用的对象不受 Abort() 的影响...因此它将继续工作并尝试使用空数组...

最后:
Abort() 将结束您的线程,除非在某些情况下(上面在其他人的答案中提到)
Abort() 在未被引用后不会结束线程(显然)

谢谢!!

于 2010-05-24T21:46:14.350 回答
0

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

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

根据您的描述,我不能 100% 确定 func2 是从 func1 线程中调用的,但是如果 func2 在从 func1 中启动的不同线程上运行,则杀死 func1 线程不会影响 func2,因为所有线程都作为子线程存在您的父进程,而不是它们开始的线程。

于 2010-05-24T21:36:15.137 回答