【问题标题】:Cancelling a already running task取消已经运行的任务
【发布时间】:2015-03-11 22:47:13
【问题描述】:

我在两个任务之间有时间间隔,如下所示。如果 timeoutTask 先完成,我想取消(或杀死)workerTask,有什么办法吗?

var timeoutTask = Task.Delay(1500);

var workerTask = Task.Run(() => { ThirdPartLibraryAPI.Run() });
var taskThatCompletedFirst = await Task.WhenAny(timeoutTask, workerTask);

        //stuff to do on timeout can be done here
if (taskThatCompletedFirst == timeoutTask)
{
  // At this point workerTask is still running.
  // how can i cancel or kill this task  
}

【问题讨论】:

标签: c# .net-4.0 timeout task cancellation


【解决方案1】:

这只有在第三方库专门提供取消支持的情况下才有可能。如果是这样,您将需要使用它公开的任何工具(有多种支持它的方法)来取消操作。

如果它本身不支持取消,那么您可以做的最好的事情就是您正在做的事情,即让您的程序继续执行,尽管操作尚未完成。

【讨论】:

  • 所以没有我可以使用的原生 Task.Cancel 类型的 API?问题是如果超时值很小,workerTask 将在未来完成,我不知道如何处理这种情况。
  • @johnsmith 在一般情况下Task 不可能支持它。代表任务的底层操作几乎可以是任何东西;无法取消任何未知操作。不同类型的实际操作会提供非常不同的取消支持。
  • 您只能使用 CancellationToken 取消 您的 任务。对于远程任务,如果第三方没有提供取消任务的方法,您可以检查是否有可以执行的补偿任务来撤消初始任务。
  • @Servy 我可以理解,但我在想任务世界中是否有与 Thread.Abort 等效的东西。
  • @johnsmith Thread.Abort 甚至不能可靠地工作,只是充满了大量的陷阱。它被认为是过时的操作。毫不奇怪,Task 不会尝试将已经损坏的功能嵌入到一个甚至大部分时间都不会应用的上下文中。
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多