【发布时间】:2020-01-30 05:52:38
【问题描述】:
我创建了以下方法 TestThrottled 来尝试限制我的任务,但是当我调用 WhenAll 并且此方法都具有相同的经过时间时,它根本没有限制。我做错什么了吗?
private static async Task<T[]> TestThrottled<T>(List<Task<T>> tasks, int maxDegreeOfParallelism)
{
var semaphore = new SemaphoreSlim(maxDegreeOfParallelism);
var tasksParallelized = new List<Task<T>>();
foreach (var task in tasks)
{
var taskParallelized = Task.Run(async () =>
{
try
{
await semaphore.WaitAsync();
return await task;
}
finally
{
semaphore.Release();
}
});
tasksParallelized.Add(taskParallelized);
}
return await Task.WhenAll(tasksParallelized);
}
private static async Task<int> TestAsync()
{
await Task.Delay(1000);
return 1;
}
static async Task Main(string[] args)
{
var sw = Stopwatch.StartNew();
var tasks = new List<Task<int>>();
var ints = new List<int>();
for (int i = 0; i < 30; i++)
{
tasks.Add(TestAsync());
}
ints.AddRange(await TestThrottled(tasks, 1));
Console.WriteLine($"{sw.ElapsedMilliseconds}, count: {ints.Count}");
Console.ReadLine();
}
【问题讨论】:
-
我不明白这个问题
-
我想限制并发任务,所以我根据该示例代码创建了该 PoC gist.github.com/kadukf/…
标签: c# .net multithreading semaphore