いやほんとぼーっとしてたんです
通常、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()
を使った場合、他のタスクも同じように止まるので、そこは注意してください。
...拙いコードかもしれませんがご査収よろしくお願いします