2〜3秒の遅延を追加する方法[終了]


129

C#でプログラムに遅延を追加するにはどうすればよいですか?


2
これにはいくつかの方法がありますが、なぜ遅延を追加する必要があるのですか?私たちが知っていれば、それを行うための最も適切な方法を提案することができます。
ChrisF

3
この質問は、Thread.Sleep()を推奨するために、絶望的に文書化されていません。
ハンスパッサン

1
わかりやすくするために、この質問の締めくくりに投票しました。これは、質の高い質の高い答えを提供するために十分な詳細情報を提供していないためです。あなたが何をしようとしているのかについてさらに詳細を追加した場合、私は完全にそれを有効な質問として再開します。早期に終了するように投票することは、質の低い質問に対する「ノイズ」の洪水を防ぐ方法です。詳細を追加したら、コメントを残すか、Modにフラグを付けて、再度開くようにします。
Cody Grey

14
この質問を閉じるという悪い決断。それは問題であり、本質的に一般的であっても問題ありません。私はそれを完全に理解しました。
user2430797 2017年

5
私が探していたもう1つの質問は、理由もなく閉じられた質問によって答えられました。
Glenn Maynard

回答:


176

あなたはThread.Sleep()関数を使うことができます、例えば

int milliseconds = 2000;
Thread.Sleep(milliseconds);

これにより、現在のスレッドの実行が2秒間完全に停止します。

おそらく最も適切なシナリオThread.Sleepは、メインとは異なる別のスレッドで操作を遅延させたい場合です。例:

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

他のシナリオ(しばらくしてから操作を開始するなど)については、Codyの回答を確認してください。


13
Thead.Sleepの原因を使用しないでください。これにより、継続時間が終了するまで、現在のスレッドが何もしないように完全にブロックされます。
Mohammed Swillam 2011年

7
@Mohammed:はい、もちろんそれは完全にトレッドをブロックします。しかし、時々それは役に立つかもしれません...それは実際にはOPが必要とするものに依存します...
digEmAll

12
新しい回答を投稿することはできないので、コメントしたいと思いますawait Task.Delay(milliseconds)。プログラムをブロックしたくない場合は、を使用できます。これは私のために働いた:)
SaiyanGirl

私の場合、他の誰かが書いたプログラムの一部から呼び出されたため、awaitを使用できませんでした。それは待ち遠しいですが、私が「ハング」した場合、私の物がシャットダウンされる前に10秒間働くことができます。2秒の睡眠は魅力のように機能します;)場合によってはこれが方法です。
16年

@MohammedElSayed:答えは異なります。それはすべて使用目的に依存します。私の場合については、データベースに挿入するときにインデックスの制約を回避するために、スレッドを0.6秒間正確にスリープさせる必要があります。
GunWanderer

61

間隔を2〜3秒に設定したタイマーを使用します。

作成するアプリケーションのタイプに応じて、3つの異なるオプションから選択できます。

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer

Thread.Sleepアプリケーションがそのスレッドの入力(WinForms、WPF)を同時に処理する必要がある場合は使用しないでください。スレッドSleepが完全にロックされ、他のメッセージを処理できなくなります。(ほとんどの場合のように)シングルスレッドアプリケーションを想定すると、おそらく意図したとおりに操作を遅延させるだけでなく、アプリケーション全体が応答を停止します。処理する「イベント」がないため、または個別のスレッド上で(これTask.Delayはより良いオプションです)、Sleepを純粋なコンソールアプリケーションで使用しても問題ないことに注意してください。

タイマーに加えて、イベントの処理からスレッドをブロックしない非同期バージョンをSleep使用できます(適切に使用されている場合-で無限スリープにしないでください)。Task.DelaySleep.Wait()

 public async void ClickHandler(...)
 {
      // whatever you need to do before delay goes here         

      await Task.Delay(2000);

      // whatever you need to do after delay.
 }

C#7.1(MSDNブログの非同期メイン)を使用している場合、コンソールアプリケーションのメソッドでawait Task.Delay(2000)も同じことが使用できます。Main

注:で操作を遅延させるSleepと、タイマーを使用して複数の操作を開始する可能性があるために発生する競合状態を回避できるという利点がありますDelay。残念ながら、UIベースのアプリケーションのフリーズは受け入れられないので、複数の遅延を開始した場合(つまり、ボタンのクリックによってトリガーされた場合)に何が起こるかを考える必要があります。そのようなボタンを無効にするか、タイマー/タスクをキャンセルするか、遅延を確認してください。操作は安全に複数回行うことができます。


5
コンソールアプリケーションの場合、Thread.Sleep警告はそれほど重要ではない可能性があります。
マーリンモーガングラハム

1
第四のタイマーがあります:System.Web.UI.Timer、ASP.NETコンポーネントは、その定期的な間隔で実行する非同期または同期のWebページのポストバックが。
デビッド

1
トップアンサーでなければなりません。これにタイマーの1つを使用する例があると、より多くの票が獲得されます...
Mercutio

コーディグレーは、あなたが追加することができawait Task.Delay()、コンソールアプリは実際にありそうなことバージョンとインラインコメントをしたい使用するSleep(非非同期Main)またはDelay(非同期Main
アレクセイLevenkov

1
@CodyGray完了。
Alexei Levenkov


6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

またはusingステートメントで:

Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);

私はこれを1000 * numSeconds(または単に3000)よりも好んでいますThread.Sleep。それはあなたの意図をよりよく文書化します。


2
1000を超えるTimeSpanの+ 1 *
2013年

.NET 4以降ではThread.Sleep(TimeSpan)、intにキャストしなくても直接使用できます。
Holf、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.