限制并发任务运行

时间:2017-05-12 10:14:32

标签: c# concurrency task

我正在尝试限制每次调用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()等待更高......

0 个答案:

没有答案