我是 .Net 4.0 的任务的新手,我无法找到我认为是基于任务的计时器的替换或实现,例如一个周期性的任务。有这种事吗?
更新 我想出了一个我认为是满足我需求的解决方案,即将“计时器”功能包装在一个任务中,所有子任务都利用 CancellationToken 并返回任务以便能够参与进一步的任务步骤。
public static Task StartPeriodicTask(Action action, int intervalInMilliseconds, int delayInMilliseconds, CancellationToken cancelToken)
{
Action wrapperAction = () =>
{
if (cancelToken.IsCancellationRequested) { return; }
action();
};
Action mainAction = () =>
{
TaskCreationOptions attachedToParent = TaskCreationOptions.AttachedToParent;
if (cancelToken.IsCancellationRequested) { return; }
if (delayInMilliseconds > 0)
Thread.Sleep(delayInMilliseconds);
while (true)
{
if (cancelToken.IsCancellationRequested) { break; }
Task.Factory.StartNew(wrapperAction, cancelToken, attachedToParent, TaskScheduler.Current);
if (cancelToken.IsCancellationRequested || intervalInMilliseconds == Timeout.Infinite) { break; }
Thread.Sleep(intervalInMilliseconds);
}
};
return Task.Factory.StartNew(mainAction, cancelToken);
}
最佳答案
它取决于 4.5,但这有效。
public class PeriodicTask
{
public static async Task Run(Action action, TimeSpan period, CancellationToken cancellationToken)
{
while(!cancellationToken.IsCancellationRequested)
{
await Task.Delay(period, cancellationToken);
if (!cancellationToken.IsCancellationRequested)
action();
}
}
public static Task Run(Action action, TimeSpan period)
{
return Run(action, period, CancellationToken.None);
}
}
显然,您可以添加一个也接受参数的通用版本。这实际上类似于其他建议的方法,因为在后台 Task.Delay 使用计时器过期作为任务完成源。
关于c# - System.Threading.Timer 是否有基于任务的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4890915/