【发布时间】:2019-10-20 15:33:47
【问题描述】:
我在这里使用 SemaphoreSlim 编写了一个简单的测试代码
static SemaphoreSlim mSemaphore = new SemaphoreSlim(3);
static async Task Main()
{
var tasks = new Task[5];
for (var i = 0; i < tasks.Length; i++)
{
var taskNo = i;
tasks[i] = Task.Run(() => DoWork($"task{taskNo}"));
}
await Task.WhenAll(tasks);
}
static async Task DoWork(string taskName)
{
for (var i = 0; i < 3; i++)
{
mSemaphore.Wait();
Console.WriteLine($"{taskName}: doing {i}.");
await Task.Delay(1000);
mSemaphore.Release();
}
}
如果我是正确的:在我的上下文中,我的信号量应该只允许 3 个任务来完成它们的工作,然后它应该释放它们,然后它应该让我的其他 2 个任务来完成它们的工作。
问题
我对此进行了测试,但不幸的是,有时我会得到不同/错误的结果。
这里有 2 个输出结果。
输出
【问题讨论】:
-
只是一个友好的提示。 SemaphoreSlim 有一个异步版本,因此您的
mSemaphore.Wait();可以替换为await mSemaphore.WaitAsync();,因为由于您使用的延迟,您的方法已经是异步的。
标签: c# async-await task semaphore