Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在指定时间执行任务不是工作_C#_Task - Fatal编程技术网

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点钟运行的任务
您可以使用

您可以使用以下代码使其在windows服务中工作:


此外,您还可以:

将其与自托管的.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));
        }
    });