LoginSignup
1
1

C#のThread.Sleep()とTask.delay()を間違ってた話

Posted at

いやほんとぼーっとしてたんです

通常、C#で実行を止めるってなったら普通はThread.Sleep()を使うはずなんですが、今回ぼーっとしすぎて間違って
Task.Delayを使ってしまいました

問題のコード

using System;
using System.Threading.Tasks;

class stop
{
    public async void Sample1()
    {
        Console.WriteLine("stopd");
        await Task.Delay(1000);
        Console.WriteLine("end.");
    }
}

class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("開始");
        stop s = new stop();
        s.Sample1();
    }
}

はい。これです
このコード、間違いがいくつかあります
まず、Task.Delayはそのメゾットの実行を遅らせながら、他のメゾットの
実行をするようなものです
例えて見るならば信号待ちのようなものです
同じところに車2台がいたとしましょう。
その車はそれまで同じように進んでいました。
ですが、1台の車がもう一台の車を少しだけ追い越し、1台の車は青信号のまま行けましたが、もう一台は赤信号で止まってしまいました。
赤信号で止まっている間も、もう一台の車は走り続けています。

...このような感じだと個人的に考えています

分かりづらいかも!ごめんね!

まあそれはともかく、今回のコードだと、一定時間後に開始されることなんてなくて、そのまま実行を停止します。
なぜかって言うと、Task.Delay()中に他の処理がないのでそのまま処理が終わるんですよね。
処理がなくても実行を停止させる方法は、Thread.Sleep()を使わないと出来ません。

直したコードがこれ

using System;
using System.Threading; // 追加
using System.Threading.Task;

class stop
{
    public void Sample1()
    {
        Console.WriteLine("stopd");
        Thread.Sleep(1000); // 修正
        Console.WriteLine("end.");
    }
}

class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("開始");
        stop s = new stop();
        s.Sample1();
    }
}

これで、stopdと表示され1秒後にend.と表示されるはずです。

ちなみに、他のタスクがある状態でThread.Sleep()を使った場合、他のタスクも同じように止まるので、そこは注意してください。

...拙いコードかもしれませんがご査収よろしくお願いします

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1