【发布时间】:2020-11-30 15:38:44
【问题描述】:
这就是我想要达到的目标。假设我有一个每分钟运行一次并执行一些 I/O 操作的进程。我希望 5 个线程同时执行并执行操作。假设如果 2 个线程花费的时间超过一分钟,当进程在一分钟后再次运行时,它应该同时执行 3 个线程,因为 2 个线程已经在执行一些操作。
所以,我使用了SemaphoreSlim 和Parallel.ForEach 的组合。请让我知道这是实现此目的的正确方法还是有其他更好的方法。
private static SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(5);
private async Task ExecuteAsync()
{
try
{
var availableThreads = _semaphoreSlim.CurrentCount;
if (availableThreads > 0)
{
var lists = await _feedSourceService.GetListAsync(availableThreads); // select @top(availableThreads) * from table
Parallel.ForEach(
lists,
new ParallelOptions
{
MaxDegreeOfParallelism = availableThreads
},
async item =>
{
await _semaphoreSlim.WaitAsync();
try
{
// I/O operations
}
finally
{
_semaphoreSlim.Release();
}
});
}
}
catch (Exception ex)
{
_logger.LogError(ex.Message, ex);
}
}
【问题讨论】:
-
所有使用
async和Parallel的代码都不正确。 -
@StephenCleary 你宁愿使用
await Task.WhenAll(tasks);吗? -
@StephenCleary 你能否解释一下为什么它是错误的。这将有助于理解
-
@ReyanChougle 我会看here
-
@ReyanChougle 你仍然可以使用 Semaphor 进行节流
标签: asp.net multithreading task-parallel-library semaphore parallel.foreach