2012-10-11 8 views
6

1秒ごとに定期的に関数を実行したいので、10秒後に10回実行します。 最も簡単な方法は、次のようにループを使用している:sleep-until in C#

while(true) 
{ 
Thread.Sleep(1000); 
function(); 
} 

をしかし、このアプローチの主な問題は、それが任意の周期保証を提供しないことです。 それは(関数を実行するために0.1秒かかる場合、私は、関数の実行時間は次のようになります)意味:私はリアルタイム言語で、覚えていたよう 0、1.1、2.2、3.3、4.4、...

ADAにはsleep-until(#time)関数があります。今私はC#の代替を探しています。

任意のサンプルコードが承認されます。

+2

小さなインバージョンでスリープして、コードを実行する前に全秒が経過したかどうかを確認します。 – VVS

+0

function()が実行するのに1秒以上かかる場合はどうしますか? –

+0

c#はリアルタイム言語ではありません。そのスレッドは、他のスレッド/プロセスが存在する可能性があるため、正確に1秒後に実行されます。正確にする必要がある場合は、他のツールを使うべきでしょうか? – YavgenyP

答えて

4
System.Threading.Timer timer = new System.Threading.Timer(ThreadFunc, null, 0, 1000); 

private static void ThreadFunc(object state) 
{ 
    //Do work in here. 
} 

です。

+0

偉大な、それは私が探していたものです。おかげでたくさん – user1654052

+0

喜んで助けてください。答えとして記入してください。 –

+0

私は2分後にそれを行います(2分後に回答を受け入れることができます) – user1654052

1

特定の時間間隔の後に何かを呼び出すには、Timerクラスを使用する必要があります。ここ は、詳細情報を参照してくださいMSDNTutorial

+0

ありがとう。それは本当に便利だった:) – user1654052

3

Stopwatchを使用して時間を測定できます。代わりにFor-Loopも使用します。

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); 
} 
+0

偉大ですが、私はまだ最後のブロックと考えています。休憩とスリープ関数の呼び出しはいつか消費し、前のものよりも利点はありません! !それは代替ですが、他のものはもっとシンプルに見えます:) – user1654052

+0

@ user1654052:実際には、それは 'TimeSpanとは何の関係もありません。(残っている> 0) 'が消費する場合、それは絶対に無視でき、1ミリ秒未満です。 –

+0

それだけではありません。慎重に見てください[sw.stop; int rest = blah; if(rest> 0)]はすべて時間とタスクのスウィッチを考慮せずに実行されました:)私はそれが無視できるように見えますが、それが1年間実行されるなら、関数が1秒ごとに実行されることを保証することはできません。それは私が受け入れ可能な答えだとは思わない理由です。 – user1654052