【问题标题】:C# Threads.Abort()C# 线程.Abort()
【发布时间】:2011-02-23 09:47:03
【问题描述】:

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

然后我调用了 thread.Abort()

这会停止func1
func1func2 以及func1 调用的所有函数??

谢谢

编辑:这里有更多细节:

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

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

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

【问题讨论】:

  • 当你写了一个测试程序并尝试了它时,发生了什么? ;)
  • 我惊奇地发现有时候func2没有停止!!
  • 您的测试程序是否足够简单,您可以将其发布在这里,以便我们尝试运行它?如果不是,您能否尝试将其简化为最简单的代码来演示您所见证的行为。
  • 我刚刚重新阅读了您的问题。我认为您假设当Thread.Abort 返回时,这意味着线程已经停止。这不是真的 - 线程停止之前可能需要一些时间(或者它可能永远不会停止)。如果您想确保线程已停止,您需要与其同步,例如通过调用Thread.Join

标签: c# multithreading abort


【解决方案1】:

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

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

强调我的。

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

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

【讨论】:

  • 顺便说一句,使用Thread.Abort() 作为控制线程执行生命周期的手段通常是个坏主意。应始终努力编写线程代码,使其对关闭条件敏感并优雅终止,而无需调用Abort
【解决方案2】:

在该线程中启动的任何操作都将被中止。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      谁在乎:
      more 调试后发现线程在启动前又被初始化了一次;导致线程在后台运行...

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

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

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

      谢谢!!

      【讨论】:

      • 请记住,ThreadAbortException 也可以在尴尬的地方注入,这可能会导致令人讨厌的情况,例如无法释放锁或无法调用 Dispose(即在资源分配之后和尝试之前注入异常) -finally 被输入)。对于可能阻塞的线程的受控线程关闭,更好的解决方案是 Thread.Interrupt()。
      猜你喜欢
      • 1970-01-01
      • 2016-03-23
      • 2014-08-11
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      相关资源
      最近更新 更多