Replace Thread.Sleep with System.Threading.Timer?

戏子无情 提交于 2020-01-07 08:30:13

问题


I'm trying to replace Thread.Sleep with System.Threading.Timer, and I'm trying to implement it in the following code. The main reason for changing is that, even though it works when testing locally, it's not working properly in the server. Plus, I've read that using it here is bad practice.

I've seen several examples (including the one below), but I'm not certain how I could use it in my case: System.Threading.Timer in C# it seems to be not working. It runs very fast every 3 second

In my console app, I need to copy files to our server every 15 minutes. So at :20, :35, :50, :05, I begin reading files for that quarter. In the case below, the files will be available at :45, and I add 5 minutes just in case.

This is my code. I had previously tried to copy files from several quarters in parallel, but the server where the source files reside is having trouble with that. So I'm going back to this.

My question is, how can I replace Thread.Sleep with System.Threading.Timer in this example?

I wanted to try await Task.Delay(Int32), but I have VS2010:

DateTime lastTimeRead = new DateTime(2014, 9, 9, 8, 35, 0);  //Last read at 8:35AM
DateTime nextTimeRead; 
for (; ; )
{
    now = DateTime.Now;  //It's currently 8:43AM
    nextTimeRead = LastTimeRead.AddMinutes(15);  // nextTimeRead = 8:50AM.
    if (nextTimeRead > now) //Yes, so wait 7 minutes for files to be available
    {
        TimeSpan span = nextTimeRead.Subtract(now);
        Double milliseconds = span.TotalMilliseconds;
        Console.WriteLine("Sleep for milliseconds: " + milliseconds.ToString());
        Thread.Sleep(Convert.ToInt32(milliseconds));
        Console.WriteLine("Download files after sleep of: " + nextTimeRead.ToString());
        DownloadFilesByPeriod(nextTimeRead);
    }
    else // Files are available. Read.
    {
        Console.WriteLine("Download files no sleep: " + nextTimeRead.ToString());
        DownloadFilesByPeriod(nextTimeRead);
    }
    LastTimeRead = nextTimeRead;
}

回答1:


The idea is to have a timer and Enable it when you want to set the delay in your program:

System.Timers.Timer Delay = new System.Timers.Timer();
Delay.Elapsed += new System.Timers.ElapsedEventHandler(Delay_Elapsed);
Delay.Interval=Convert.ToInt32(milliseconds);
Delay.Enabled = false;

 void Delay_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  {
    Delay.Enabled = false; 
  }
......
.....
if (nextTimeRead > now) //Yes, so wait 7 minutes for files to be available
    {
        TimeSpan span = nextTimeRead.Subtract(now);
        Double milliseconds = span.TotalMilliseconds;
        Console.WriteLine("Sleep for milliseconds: " + milliseconds.ToString());
        Delay.Enabled = true;
        while (Delay.Enabled)
        {
          ////Wait until time passes
        }
        Console.WriteLine("Download files after sleep of: " + nextTimeRead.ToString());
        DownloadFilesByPeriod(nextTimeRead);
    }


来源:https://stackoverflow.com/questions/25747006/replace-thread-sleep-with-system-threading-timer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!