【发布时间】:2019-04-28 23:04:23
【问题描述】:
我在一个 3rd 方库中有一个函数,它偶尔会变得流氓并且永远不会返回。像这样:
// This is 3rd party function so I can't make it take a cancellation token.
public void RogueFunction()
{
while (true)
{
_logger.LogInformation("sleeping...");
Thread.Sleep(100);
}
}
我想将它包装在一个带有超时的任务中,这很容易使用“task.Wait(mills)”来完成。虽然这会在超时后将控制权交还给我,但它实际上并没有终止任务。
在下面的代码中,rogue 函数在超时后继续记录。
[Fact]
public void Test()
{
var task = Task.Factory.StartNew(RogueFunction);
var complete = task.Wait(500);
if (!complete)
{
// how do I kill the task so that it quits logging?
Thread.Sleep(5000);
task.Dispose(); // Throws exception: A task may only be disposed if it is in a completion state (RanToCompletion, Faulted or Canceled).
}
}
我如何完全终止这个任务,这样我就可以重试它,而不会导致一堆它们在我的后台线程池中无限运行。
【问题讨论】:
-
使用取消令牌在设定的时间后取消任务
-
很遗憾,取消令牌与 task.Wait(timeout) 的效果相同。