【发布时间】: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