【问题标题】:How to cancle a task on Thread.Abort()如何取消 Thread.Abort() 上的任务
【发布时间】:2018-11-29 08:06:58
【问题描述】:

我正在实现一个由其他人调用的方法。如果我的方法需要很长时间,调用者将调用Thread.Abort()。我在我的方法中启动了一些任务,如果我的线程中止,需要取消这些任务。

我目前猜测我的超时时间并在此时间跨度之后取消任务。它并不总是相同的超时,这取决于我的方法之前执行的操作。

有没有办法将我的任务与该线程的生命周期联系起来?


更新

为了防止任何进一步的 cmets,我不应该使用 Thread.Abrot(),这是处理中止的代码(不是我调用的,无法更改)

        using (var cancelationTokenSource = new CancellationTokenSource())
        {
            try
            {
                DoWork(cancelationTokenSource.Token);
            }
            catch (ThreadAbortException)
            {
                cancelationTokenSource.Cancel();
                throw;
            }
        }

我使用CancelationToken 而不是Thread.Abort()

【问题讨论】:

  • 无论如何,你不应该使用 Thread.Abort 作为一个坏主意来杀死一个线程。使用 CancellationTokens 使用协作取消,这是应该中止任务的预期方式。
  • 任务在独立线程上运行。为什么在使用任务时调用 Thread.Abort 呢?你的代码是什么样的?不需要 Thread.Abort 来实现超时,CancellationTokenSource、Task.Delay、各种组合已经提供了这个功能
  • 即使你真的需要线程,也可以使用 CancellationTokenSource 来取消任务线程协同工作。
  • “我正在实现一个由其他人调用的方法”我无法控制这一点。对于我自己的方法,我使用 CancellationTokens。但我无法改变我的称呼。
  • 请不要致电Thread.Abort()。即使您处理任何异常,它仍然会破坏运行时,这意味着剩余的线程可能无法正常运行。它应该只在强制应用程序关闭时使用。

标签: c# multithreading task task-parallel-library


【解决方案1】:

您可以处理 ThreadAbortException 来处理清理工作,包括在必要时中止其他线程。

void MyThreadProc()
{
    try
    {
        //Do interesting things
    }
    catch ( ThreadAbortException e )
    {
        childThread.Abort();
    }
}

【讨论】:

  • 谢谢。我认为ThreadAbortException 是一个无法捕获的特殊异常。我再次重新编辑了文档,它说它很特别,并在捕获结束时重新抛出。我现在在 finally 块中取消。感谢您的帮助。
  • 请不要致电Thread.Abort()。即使您处理任何异常,它仍然会破坏运行时,这意味着剩余的线程可能无法正常运行。它应该只在强制应用程序关闭时使用。
猜你喜欢
  • 2011-05-20
  • 2016-12-27
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2022-06-13
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多