gpt4 book ai didi

c# - 匿名并行任务计时器?

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

也许我的大脑有点炸了,所以我错过了一些执行以下操作的好方法...我希望能够通过按特定时间间隔运行的任务启动计时器并在每个时间间隔检查某些条件它是否应该 self 取消,最优雅的解决方案是什么?

最理想的情况是:

            Task.Factory.StartNew(() =>
{
Timer.Do(TimeSpan.FromMilliSeconds(200),() => ShouldCancel(), ()=>
{
//DoStuff
});
});

使用 while/thread-sleep 循环似乎不是最佳选择。我想我可以定义和使用一个普通的计时器,但它看起来有点笨重......

最佳答案

像下面这样的东西怎么样?我相信 API 可以稍微清理一下。

注意事项:

DoWork 方法必须支持协作取消,这是任务并行库支持的唯一取消方法。

定时器必须在Task内部启动,否则可能会创建并调度Task但没有执行,定时器会计时任务等待时间而不是执行时间。

如果您想提供其他外部取消机制(其他 token ),那么您需要传入另一个上下文并链接它们。请参阅:CancellationTokenSource.CreateLinkedTokenSource

这只是近似值 System.Threading.Timer只有毫秒精度。它应该足以限制任务运行几秒钟。

public static class TimeLimitedTaskFactory
{
public static Task StartNew<T>
(Action<CancellationToken> action, int maxTime)
{
Task tsk = Task.Factory.StartNew(() =>
{
var cts = new CancellationTokenSource();
System.Threading.Timer timer = new System.Threading.Timer(o =>
{
cts.Cancel();
Console.WriteLine("Cancelled!");
}, null, maxTime, int.MaxValue);
action(cts.Token);
});
return tsk;
}
}

class Program
{
static void Main(string[] args)
{
int maxTime = 2000;
int maxWork = 10;

Task tsk = TimeLimitedTaskFactory
.StartNew<int>((ctx) => DoWork(ctx, maxWork), maxTime);

Console.WriteLine("Waiting on Task...");
tsk.Wait();
Console.WriteLine("Finished...");
Console.ReadKey();
}

static void DoWork(CancellationToken ctx, int workSize)
{
int i = 0;
while (!ctx.IsCancellationRequested && i < workSize)
{
Thread.Sleep(500);
Console.WriteLine(" Working on ", ++i);
}
}
}

关于c# - 匿名并行任务计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4458618/

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