こんにちは。
本日はC#メモです。
Thread.Sleep()を使用した処理の待機
Thread.Sleep()は引数に指定した時間分処理を待機します。
Thread.Sleep(TimeSpan.FromMilliseconds(1000));
待機をキャンセルする
以下のようにキャンセルトークンを引数でもらい
都度監視するようにします。
public void Sample(int millsec, CancellationToken token) { var cur = 0; var span = 50; try { Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] Start."); for (;;) { if (token.IsCancellationRequested) { return; } Thread.Sleep(TimeSpan.FromMilliseconds(span)); cur += span; if (millsec <= cur) { return; } } } finally { Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] End."); } }
呼び出し側は以下です。
待機時間には2秒を指定しますが、1秒待機後にキャンセルします。
var cts = new CancellationTokenSource(); var token = cts.Token; var t = Task.Run(() => { this.Sample(2000, token); }); Thread.Sleep(1000); cts.Cancel(); t.Wait();
実行結果は以下です。
1秒後にキャンセルされて待機が終了しています。
[15:07:19.042] Start. [15:07:20.054] End.
Task.Delay()を使用した処理の待機
Task.Delay()もThread.Sleep()と同様に
引数に指定した時間処理を待機します。
Task.Delay()は戻り値がTaskとなります。
var t = Task.Delay(TimeSpan.FromMilliseconds(1000)); t.Wait();
待機をキャンセルする
Task.Delay()は引数にキャンセルトークンを指定してキャンセルが可能です。
public void Sample(int millsec, CancellationToken token) { Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] Start."); Task.Delay(TimeSpan.FromMilliseconds(millsec), token); Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] End."); }
呼び出し側は以下です。
待機時間には2秒を指定しますが、1秒待機後にキャンセルします。
var cts = new CancellationTokenSource(); var token = cts.Token; var t = Task.Run(() => { this.Sample(2000, token); }); Thread.Sleep(1000); cts.Cancel(); t.Wait();
実行結果は以下です。
1秒後にキャンセルされて待機が終了しています。
[15:23:27.888] Start. [15:23:28.909] End.
以上です。