Timer 或 Task 适合空闲时间长的任务吗
Is Timer or Task good for tasks with long idle time
我有一组项目每天只需要在特定时间 运行 一次。我想 运行 每个项目都作为一个网络服务并使用 Timer 或 Task.Delay 来安排工作,但是 timer/task 是否适合安排空闲时间较长的工作?
这是我的调度程序配置,以及如何创建计时器。所有配置都存储在数据库中。
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 服务来询问您的调度配置并在所需时间 运行 进程可能是可行的方法。
我有一组项目每天只需要在特定时间 运行 一次。我想 运行 每个项目都作为一个网络服务并使用 Timer 或 Task.Delay 来安排工作,但是 timer/task 是否适合安排空闲时间较长的工作?
这是我的调度程序配置,以及如何创建计时器。所有配置都存储在数据库中。
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 服务来询问您的调度配置并在所需时间 运行 进程可能是可行的方法。