私は最近、C# の新しい async/await と Task.Run 機能に頭を悩ませようとしています。そうすることで、コンソールに書き込みを行う簡単なテスト コードを作成して、物事がどのような順序で発生するかを確認できるようにしました。
これが私のテストの1つです
[Test]
public void TaskRun()
{
Console.WriteLine("Before");
Task.Run(() => Console.WriteLine(_terminator.IWillBeBack()));
Console.WriteLine("After");
}
次の Terminator クラスを使用します。
public class Terminator
{
public string IWillBeBack()
{
return "I will be back";
}
}
このことから、結果はおそらくBefore、After、そしてI will be back になると予想しました。これは実際に起こることです。次に、IWillBeBack メソッドを変更して、3 秒間スリープできるようにします。このためのコード:
public class Terminator
{
public string IWillBeBack()
{
Thread.Sleep(3000);
return "I will be back";
}
}
結果はまだBefore、Afterであり、3 秒後に再びI will be back になると予想していました。しかし、これは起こることではありません。代わりにBeforeとAfterを取得しますが、決して戻ることはありません。
どうしてこれなの?
デバッグすると、明らかにコードを通過し、スリープして戻ります。この方法では、プロダクション コードでは Thread.Sleep は必要ありませんが、2 番目のケースではコンソールに書き込まれない理由を漠然と理解したいと思います。