我正在尝试限制每次调用Create
到5个任务时可以并行运行的并发任务数。
在我的代码中,Parallel.ForEach似乎根本没有做任何限制。
如何限制Create
创建的并发任务数?
public async Task Create(List<FormModel> forms)
{
var tasks = new List<Task>();
Parallel.ForEach(forms, new ParallelOptions { MaxDegreeOfParallelism = 5 }, form =>
{
tasks.Add(makePdfAsync(form));
});
await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(TimeSpan.FromMinutes(10)));
}
public async Task makePdfAsync()
{
var message = new PdfMessageModel();
message.forms = new List<FormModel>() { form };
var retry = 10;
var uri = new Uri("http://localhost.:8007");
var json = JsonConvert.SerializeObject(message);
using (var wc = new WebClient())
{
wc.Encoding = System.Text.Encoding.UTF8;
// reconnect with delay in case process is not ready
while (true)
{
try
{
await wc.UploadStringTaskAsync(uri, json);
break;
}
catch
{
if (retry-- == 0) throw;
}
}
}
}
编辑: semaphoreSlim的建议没有改善。
解决方案是将限制并发任务的代码移动到makePdfAsync()
的try子句中,因为tasks.Add(makePdfAsync(form))
永远不会受到限制,无论您使用什么线程限制构造。
我愚蠢地认为来自await
的{{1}}会使所有makePdfAsync()
等待更高......