Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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#_Thread Sleep - Fatal编程技术网

睡到c#

睡到c#,c#,thread-sleep,C#,Thread Sleep,我希望每1秒周期性地运行一个函数,因此在10秒后它将执行10次。 最简单的方法是使用如下循环: while(true) { Thread.Sleep(1000); function(); } 但这种方法的主要问题是,它不会提供任何定期担保。 我的意思是,如果运行函数()需要0.1秒,函数的执行时间如下: 0,1.1,2.2,3.3,4.4 我记得,在实时语言ADA中,我们有一个函数sleep-until(#time)。现在我正在寻找C#的替代方案 任何示例代码都将收到通知。要在特定时间间隔后调

我希望每1秒周期性地运行一个函数,因此在10秒后它将执行10次。 最简单的方法是使用如下循环:

while(true)
{
Thread.Sleep(1000);
function();
}
但这种方法的主要问题是,它不会提供任何定期担保。 我的意思是,如果运行函数()需要0.1秒,函数的执行时间如下: 0,1.1,2.2,3.3,4.4

我记得,在实时语言ADA中,我们有一个函数sleep-until(#time)。现在我正在寻找C#的替代方案


任何示例代码都将收到通知。

要在特定时间间隔后调用某些内容,应使用Timer类。 这是你的电话号码

有关更多信息,请参阅。

您可以使用测量时间。我还将使用
For循环

var sw = new System.Diagnostics.Stopwatch();
var timeForOne = TimeSpan.FromSeconds(1);
var count = 10;
for(int i = 0; i < count; i++)
{
    sw.Restart();
    function();
    sw.Stop();
    int rest = (timeForOne - sw.Elapsed).Milliseconds;
    if (rest > 0)
        System.Threading.Thread.Sleep(rest);
}
var sw=new System.Diagnostics.Stopwatch();
var timeForOne=从秒开始的时间跨度(1);
var计数=10;
for(int i=0;i0)
系统。线程。线程。睡眠(rest);
}

在较小的inverals中休眠,并检查在执行代码之前是否已过了整整一秒钟。如果function()的执行时间超过1秒,您希望发生什么?c#不是实时语言。它甚至不能保证线程将在1秒后执行,因为可能还有其他线程/进程。如果你需要这么精确,也许你应该使用其他工具?我想这不会超过1秒。但如果多线程是可能的,我喜欢并行运行它们。我知道c#不是一种实时语言,但我很想知道我们是否能够以某种方式模拟实时行为。我会在2分钟后做这件事(你可以在2分钟后接受答案),非常感谢。这真的很有用:)太好了,但我仍然认为最后一个if块,rest和sleep函数调用的计算会消耗一些时间,并且看不出比前一个有什么优势!!这是另一种选择,但另一种看起来更简单:)@user1654052:实际上,时间跨度是无法量化的。减去+
如果(rest>0)
消耗,它绝对可以忽略不计,并且不到1毫秒。不仅仅如此。仔细看一看。[sw.stop;int rest=blah;if(rest>0)]所有的执行都没有考虑它的时间和任务切换:)我知道它看起来可以忽略不计,但是如果它将运行一年,你不能保证每一秒钟执行一次函数。这就是为什么我不认为这是一个可以接受的方案answer@user1654052:您可以省略
sw.Stop()sw.appead
)。不管怎么说,这三条线所消耗的时间都远远少于一毫秒,因为它们是简单的算术运算。然而,您是对的,您需要补偿舍入问题等,如果它运行时间长,您需要高精度。
var sw = new System.Diagnostics.Stopwatch();
var timeForOne = TimeSpan.FromSeconds(1);
var count = 10;
for(int i = 0; i < count; i++)
{
    sw.Restart();
    function();
    sw.Stop();
    int rest = (timeForOne - sw.Elapsed).Milliseconds;
    if (rest > 0)
        System.Threading.Thread.Sleep(rest);
}