LoginSignup
0
1

More than 1 year has passed since last update.

SemaphoreSlim を使ったイベント待ち受け

Posted at

スレッド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!

うん。こっちの方がずっと良い。

0
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
0
1