web-dev-qa-db-ja.com

メインスレッドをブロックせずにしばらく待つ

私のメソッドが約500ミリ秒待機してから、一部のフラグが変更されたかどうかを確認したいと思います。アプリケーションの残りの部分をブロックせずにこれを完了するにはどうすればよいですか?

26
santBart

Thread.Sleep(500)は、現在のスレッドを強制的に500ms待機させます。それは機能しますが、アプリケーション全体が1つのスレッドで実行されている場合は、望みどおりではありません。

その場合は、次のようにTimerを使用します。

using System.Timers;

void Main()
{
    Timer t = new Timer();
    t.Interval = 500; // In milliseconds
    t.AutoReset = false; // Stops it from repeating
    t.Elapsed += new ElapsedEventHandler(TimerElapsed);
    t.Start();
}

void TimerElapsed(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Hello, world!");
}

タイマーを繰り返したい場合は、AutoResetをtrueに設定する(またはまったく設定しない)ことができます。

30
Toneo

Sleepのようにスレッドをブロックすることなく、タイマーよりもはるかに少ないコードでawait Task.Delay(500);を使用できます。

12
MarkovskI

質問がよくわかりません。

チェックする前にブロックする場合は、Thread.Sleep(500);を使用します

X秒ごとに非同期でチェックする場合は、 Timer を使用して、xミリ秒ごとにハンドラーを実行できます。

これは現在のスレッドをブロックしません。

7
Tudor

問題のメソッドがアプリケーションの他の部分とは異なるスレッドで実行されている場合は、次のようにします。

Thread.Sleep(500);
5
Phil Klein
System.Threading.Thread.Sleep(500);

更新

これにより、アプリケーションの残りの部分はブロックされず、メソッドを実行しているスレッドのみがブロックされます。

2
danludwig

タイマーを使うとうまくいくはずです

スレッドを使用する必要がある場合は、ここに例があります

void Main()
{
    System.Threading.Thread check= new System.Threading.Thread(CheckMethod);
    check.Start();
}

private void CheckMethod()
{
     //Code
     Thread.Sleep(500);
}
0

非同期タスク:

 var task = new Task (() => function_test()); task.Start();

public void function_test() { `Wait for 5000 miliseconds`   Task.Delay(5000);` }
0
gimpy