c# - Timer 或 Task 适合空闲时间长的任务吗

标签 c# timer task

我有一组项目,每天只需要在特定时间运行一次。我想将每个项目作为 Web 服务运行并使用 Timer 或 Task.Delay 来安排工作,但是定时器/任务是否适合安排空闲时间较长的工作?

这是我的调度程序配置,以及如何创建计时器。所有配置都存储在数据库中。

public class ScheduledTaskStructure : IDisposable
{
    private Timer _timer;

    public void Start()
    {
        _timer = new Timer();
        _timer.Interval (new TimeSpan(24,0,0)).TotalMilliseconds;
        _timer.AutoReset = false;
        _timer.Elapsed += _timer_Elapsed;
    }

    private Assembly _Assembly;
    private object _instance;
    private Type _classType;
    MethodInfo _MethodInfo;
    void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        _timer.Stop();

        if (_Assembly == null)
        {
            _Assembly = Assembly.LoadFrom(ModuleName);
            _instance = _Assembly.CreateInstance(ClassName, true);
            _classType = _Assembly.GetType(ClassName, true, true);
            _MethodInfo = _classType.GetMethod(MethodName);
        }

        _MethodInfo.Invoke(_instance, null);

        _timer.Start();
    }

    public void Stop()
    {
        if (_timer != null)
        {
            _timer.Stop();
            _timer = null;
        }
    }

    public volatile bool IsRunning { get; set; }

    #region IDisposable Members

    public void Dispose()
    {
        _timer = null;
    }

    #endregion

    public string Task { get; set; }

    public DateTime NextRun { get; set; }
    public string TimeInterval { get; set; }
    public string ModuleName { get; set; }
    public string ClassName { get; set; }
    public string MethodName { get; set; }
    public string Status { get; set; }
    public bool IsUsed { get; set; }
}

最佳答案

通常这样使用 Timer 并不好,在 IIS 中情况更糟 - IIS 将专门杀死空闲进程(除非您将其配置为不这样做或对其执行 ping 以使其保持事件状态)。

在任何情况下,您实际上都在运行并且在 23:59:00 不必要地占用资源,您的程序实际上并没有做任何事情,并且在此期间它可能会被杀死或发生任何事情。

在指定时间运行事物有更好的结构。其中最简单的方法是将您的应用程序添加到 Windows 任务计划程序中。

对于更复杂的需求,编写一个 Windows 服务来询问您的调度配置并在所需时间运行进程可能是可行的方法。

关于c# - Timer 或 Task 适合空闲时间长的任务吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29962416/

相关文章:

c# - 运行任务,做某事然后等待?

c# - 在 utf-8 json 上转义重音字符

powershell - 如何在 Powershell 消息框中获取计时器?

python - 运行更多任务的 Celery 任务

task - 在集群上运行大量任务

触摸式 Android 缩放按钮

c# - 请说明如何在.Net 4.6中使用EventListener类

c# - LINQ:分页技术,使用 take 和 skip 但还需要总记录 - 如何实现?

c# - 将 ListView 与对象集合相关联

java-me - 如何在 J2ME 或 LWUIT 中创建计时器?