Here is my code
SemaphoreSlim slim = new SemaphoreSlim(1);
_ = Task.Run(() =>
{
Task.Delay(2000);
_testOutputHelper.WriteLine("Unleash!");
slim.Release();
});
_testOutputHelper.WriteLine("Waiting");
await slim.WaitAsync();
_testOutputHelper.WriteLine("Done");
The output is ironically as follows:
Waiting
Unleash!
Done
AFAIK WaitAsync() is suppose to allow the thread since I've set initial count as 1. Somehow it's not behaving that way
Any help?
CodePudding user response:
You forgot to await
your Task.Delay(2000)
, so this line basically does nothing and Task.Run
thread immediately goes and writes "Unleash!", then releases semaphore. So to achieve what you want, just await that delay, giving main thread time to reach WaitAsync
first:
SemaphoreSlim slim = new SemaphoreSlim(1);
_ = Task.Run(async () =>
{
await Task.Delay(2000);
Console.WriteLine("Unleash!");
slim.Release();
});
Console.WriteLine("Waiting");
await slim.WaitAsync();
Console.WriteLine("Done");