【问题标题】:Setting C# SemaphoreSlim minimum count does not seem to work设置 C# SemaphoreSlim 最小计数似乎不起作用
【发布时间】:2021-10-10 08:18:53
【问题描述】:

这是我的代码

   SemaphoreSlim slim = new SemaphoreSlim(1);
            _ = Task.Run(() =>
            {
                Task.Delay(2000);
                _testOutputHelper.WriteLine("Unleash!");
                slim.Release();
            });
            _testOutputHelper.WriteLine("Waiting");
            await slim.WaitAsync();
            _testOutputHelper.WriteLine("Done");

输出讽刺如下:

Waiting
Unleash!
Done

AFAIK WaitAsync() 假设允许线程,因为我已将初始计数设置为 1。不知何故,它的行为不是那样

有什么帮助吗?

【问题讨论】:

  • 而不是_testOutputHelper.WriteLine => Console.WriteLine,这样你的例子就可以被大家编译测试了。
  • 在单元测试中运行

标签: c# async-await concurrency semaphore


【解决方案1】:

你忘了await你的Task.Delay(2000),所以这条线基本上什么都不做,Task.Run线程立即去写“释放!”,然后释放信号量。所以要实现你想要的,只需等待那个延迟,让主线程有时间首先到达WaitAsync

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");

【讨论】:

  • 哦,我真傻!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2019-06-19
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
相关资源
最近更新 更多