なんだかGoodVibes

日々の勉強メモです。

【C#】処理を待機する(Thread.Sleep、Task.Delay)

こんにちは。
本日は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.



以上です。