c# - System.Threading.Timer 是否有基于任务的替代品?

标签 c# .net-4.0 timer timeout task-parallel-library

我是 .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/

相关文章:

c# - 在 VisualStudio 调试器退出时执行代码

c# - IExtensibleDataObject 与 IExtensibleObject?

java - GWT 函数在 DatePicker 能够返回所选日期之前完成,如何延迟直到返回日期?

Javascript onkeyup 延迟函数调用

ios - Swift 3 - 即使应用程序在后台运行功能

c# - 我得到 "Non abstract, non-.cctor-method in an interface"的原因是什么?

c# - 如何获取 OData 可查询 Web API 端点过滤器并将其映射到 DTO 对象?

c# - UserControl 的 RelativeSource 绑定(bind)

c# - 垃圾收集未按预期运行

c# - 统计每个词出现的频率