gpt4 book ai didi

c# - 如何用超时包装流氓函数?

转载 作者:行者123 更新时间:2023-11-30 21:28:55 30 4
gpt4 key购买 nike

我在 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)'来完成。虽然这会在超时后将控制权返回给我,但它实际上并没有终止任务。

在下面的代码中,流氓函数在超时后继续记录。

    [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).
}
}

我如何完全终止此任务,以便我可以重试它而不会导致一堆任务在我的后台线程池中无限运行。

最佳答案

似乎Thread.Abort是您唯一的选择。如果您担心这样做可能会使应用程序处于损坏状态(打开文件句柄等),那么最安全的选择是在不同的进程中运行线程,然后 kill the process .另一个可行的解决方案是在不同的 AppDomain 中运行线程,然后中止线程并 unload the AppDomain .

关于c# - 如何用超时包装流氓函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55885426/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com