C# 在指定时间执行任务不是工作
我知道有很多解决方案。我想知道这段代码不起作用的原因,谢谢。 我每天都试图在特定的时间执行代码。我的代码如下:C# 在指定时间执行任务不是工作,c#,task,C#,Task,我知道有很多解决方案。我想知道这段代码不起作用的原因,谢谢。 我每天都试图在特定的时间执行代码。我的代码如下: private static void RunTask(string taskName, int hour, Action act) { if (hour > 23 || hour < 0) throw new ArgumentOutOfRangeException("invalid hour"); T
private static void RunTask(string taskName, int hour, Action act)
{
if (hour > 23 || hour < 0)
throw new ArgumentOutOfRangeException("invalid hour");
Task.Factory.StartNew(() =>
{
var log = new Lazy<Logger>(...);
while (true)
{
try
{
log.Value.LogInfo($"{taskName} running at {hour} clock,{DateTime.Now}");
if (DateTime.Now.Hour == hour)
act?.Invoke();
}
catch (Exception ex)
{
log.Value.LogException(ex);
}
Thread.Sleep(new TimeSpan(0, 55, 0));
}
});
}
...
RunTask("task",0,someAction);
...
private static void RunTask(字符串taskName,int hour,Action act)
{
如果(小时>23 | |小时<0)
抛出新ArgumentOutOfRangeException(“无效小时”);
Task.Factory.StartNew(()=>
{
var log=新的惰性(…);
while(true)
{
尝试
{
log.Value.LogInfo($“{taskName}在{hour}时钟运行,{DateTime.Now}”);
if(DateTime.Now.Hour==小时)
act?.Invoke();
}
捕获(例外情况除外)
{
log.Value.LogException(ex);
}
睡眠(新的时间跨度(0,55,0));
}
});
}
...
RunTask(“任务”,0,someAction);
...
它应该在0点钟执行代码,但在windows server中不起作用。这是我的日志内容:
- 2018年4月9日9:35:59,0点钟运行的任务
- 2018年4月9日13:07:08时0分运行的任务
- 2018年4月10日19:32:50,0点钟运行的任务
- 2018年4月11日1:36:39 0点运行的任务
- 2018年4月11日14:18:07,0点钟运行的任务
- 2018年4月11日14:55:45 0点运行的任务
- 2018年4月11日16:01:53,0点钟运行的任务
此外,您还可以: 将其与自托管的.NETWebAPI混合使用,可以有一个良好的ui来监视您的任务
避免使用
线程睡眠(新的时间跨度(0,55,0))代码>由于它阻止了您,并且由于应用程序中发生了线程上下文切换,所以您的线程可能无法按时启动
您可以使用计时器每55分钟执行一次操作,方法如下所示
static void Main()
{
Timer timer = new Timer(intvalue); //intvalue equal to 55 min
timer.Elapsed += async ( sender, e ) => await HandleTimer();
timer.Start();
Console.Write("Press any key to exit... ");
Console.ReadKey();
}
private static Task HandleTimer()
{
Console.WriteLine("\nHandler not implemented..." );
}
使用计时器的优点之一是,它每55分钟执行一次,因为它不会等待前一个线程完成,这意味着如果前一个任务运行超过55分钟,则下一个任务将启动并开始执行
你可以让线程等待
Task.Factory.StartNew(async () =>
{
while (true)
{
//await for 55 min
await Task.Delay(new TimeSpan(0, 55, 0));
}
});
这只是一个建议,可能有助于使用Windows任务计划程序。甚至还有一个groovy API。总比让一个昂贵的长时间运行的线程什么都不做要好Windows任务调度器同意,或者使用一些框架工作,比如quartznet。您当前的方法将是脆弱的,并且永远不会在正确的时间执行55分钟?这是一个令人昏昏欲睡的线程。我不确定你的代码如何在“0”时钟下运行,你先睡55分钟,然后运行act.Invoke()
,如果DateTime.Hour==Hour。您的计时最长为54.999分钟。此外,您每55分钟写入一次日志,而不仅仅是在“0”小时。不起作用的是您的操作方法没有被调用?事实上,我仍然想知道我的代码不起作用的原因。谢谢,但这对我不起作用。顺便说一下,System.Threading.Timer
@Cyan-更新的答案是,你的情况是什么,你能解释一下吗,可以试着帮我找到问题。Timer
是System.Timers.Timer
,不是SystemTheading.Timer
,但是,我现在用Hangfire来处理这件事,谢谢你。
static void Main()
{
Timer timer = new Timer(intvalue); //intvalue equal to 55 min
timer.Elapsed += async ( sender, e ) => await HandleTimer();
timer.Start();
Console.Write("Press any key to exit... ");
Console.ReadKey();
}
private static Task HandleTimer()
{
Console.WriteLine("\nHandler not implemented..." );
}
Task.Factory.StartNew(async () =>
{
while (true)
{
//await for 55 min
await Task.Delay(new TimeSpan(0, 55, 0));
}
});