1

かわいらしいシンプルなものが必要です

while (true) {
    DoJob();
    // wait 1 ms
}

私はただ使うべきThread.Sleep(1)ですか?それ自体のオーバーヘッドは1ミリ秒より少し長いTimerように思われるので、使用するかどうかはわかりません。Timer

更新:ネットワークから最新の情報を確実に受信するには、この遅延が必要です。これは取引ソフトウェアです。私は何かをする必要があり、それから私は何が起こるかを見るために1ミリ秒待たなければなりません。1.5ミリ秒待つことはできますが、3ミリ秒待つことはできません。5ミリ秒または10ミリ秒待つことはめったにありませんが、通常は1ミリ秒程度である必要があります。

4

2 に答える 2

2

これを行う別の方法があるかもしれません。Windowsには高解像度タイマーがあります。あなたはここでそれについて読むことができます:「方法:高解像度タイマーを使用する」

これは通常のタイマーのようには機能しないと思います。イベントを発生させるのではなく、経過時間を高精度で測定するために使用するだけです。ただし、それをループして、ミリ秒が経過したときにコードを実行することはできます(常にCPUを消費します)。また、WindowsはリアルタイムのO/Sではないというヘンクのコメントにも同意します。O/Sがいつスレッドを一時停止するかはわかりません。

于 2012-04-22T22:27:51.493 に答える
2

編集-修正済み「睡眠から得られるほとんどの解像度は、100ミリ秒ではなく約20ミリ秒になります

Sleep(1)を通過した場合でも、スリープから抜け出すためのほとんどの解像度は100ミリ秒です。

価値があるのは、タイマーの方が効率的かもしれません-特に複数のスレッドがスリープしている場合(System.Threading.Timerは、複数のタイマーを割り当てる場合、必要な数のスレッドを使用し、それらは共有しますタイミングスレッド)(これはJoe Duffyの並行プログラミングの本から)

しかし、もっと重要なことは、あなたは何をしようとしているのですか?ポーリングしている場合-何かが起こるのを待つ必要がある場合は、それを行うためのより効率的な手段を使用できる可能性があります。頻繁にタスクを実行する必要がある場合は、タイマーが最善の策になるでしょう。

ミリ秒だけ停止したい場合は、理由を尋ねてもよいですか?スレッドが他のプロセスに譲ることを確認しようとしているだけですか?

于 2012-04-22T17:53:39.167 に答える