スレッドAと、スレッドBが平行で動作しており、スレッドBがスレッドAの完了を待ち受けしたい場合、例えばこんな感じのコードを書くことができる。
Program.cs
bool readyToStart = false;
Task task1 = Task.Run(async () =>
{
while (true)
{
if (readyToStart) break;
await Task.Delay(TimeSpan.FromSeconds(1));
}
Console.WriteLine("I started");
});
Task task2 = Task.Run(async () => {
Console.WriteLine("Wait for 5 sec by loop");
await Task.Delay(TimeSpan.FromSeconds(5));
readyToStart= true;
});
await Task.WhenAll(task1, task2);
出力結果
Wait for 5 sec by loop
I started
動くのだけど、待ち受けのループが発生してダサい。このようなケースだと、ループではなく、イベントを待ち受けするコードに変えた方がすっきりする。
Program.cs
var semaphore = new SemaphoreSlim(0, 1);
// Thread one
// Wait for the event happening.
var task1 = Task.Run(async () =>
{
await semaphore.WaitAsync();
Console.WriteLine($"I Started!");
});
// Thread two
// Fire the event after after a delay.
var task2 = Task.Run(async () =>
{
Console.WriteLine("Wait for 5 sec");
await Task.Delay(TimeSpan.FromSeconds(5));
Console.WriteLine("Going to release semaphore");
semaphore.Release();
});
await Task.WhenAll(task1, task2);
出力結果
Wait for 5 sec
Going to release semaphore
I Started!
うん。こっちの方がずっと良い。