Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#_Multithreading - Fatal编程技术网

C# 我该睡几个小时还是有更聪明的方法?

C# 我该睡几个小时还是有更聪明的方法?,c#,multithreading,C#,Multithreading,我必须在一个线程中每1小时更新一些数据。我将方法检查器放入一个新线程 if ((time_now - last_update) < 3600) Thread.Sleep(3600 * 1000); if((现在时间-上次更新)

我必须在一个线程中每1小时更新一些数据。我将方法检查器放入一个新线程

if ((time_now - last_update) < 3600)
            Thread.Sleep(3600 * 1000);
if((现在时间-上次更新)<3600)
线程睡眠(3600*1000);

但我觉得这是不对的。也许有一种优雅而廉价的方法可以在不使用
线程的情况下每小时检查一次更新。在C#?

中使用Sleep
查看类(或其他计时器,使用最适合您的计时器)。

在固定时间运行拉取方法如何:

var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromHours(1);

var timer = new System.Threading.Timer((e) =>
{
    YourPullingMethod();
}, null, startTimeSpan, periodTimeSpan);

睡眠不应该被使用。不可靠,不能取消;它也在阻塞

您可以执行以下操作

object waitTimeOut = new object();

lock (waitTimeOut) 
{ 
      Monitor.Wait(waitTimeOut, TimeSpan.FromMilliseconds(3600 * 1000)); 
} 


或者,对于使用cron作业的频率较低的情况,其他评论都很好;而且更适合您正在做的事情

我觉得这应该由您的操作系统中的某些东西来安排——查看cron作业。看起来你不想让程序运行一个小时。另外,如果程序关闭,作业将停止。是的,请使用Windows任务计划进行此操作。不要让一根线睡上几个小时。这是浪费。另外,总是可以使用异步调用,也可以使用计时器,但我认为最好使用OSUse timer来安排它,如果它的c#是根据时间的流逝来触发事件,考虑一下你在现实生活中会做什么。线程是工人。如果你每小时都有工作要做,你会雇一个工人,让他们在不工作的时候睡觉吗?或者你会给一个现有的工人一个闹钟,然后说“当闹钟响的时候,做这个工作”?
 TimeSpan ts = TimeSpan.FromMilliseconds(3600 * 1000);
 t.Wait(ts)