私はCreate
メソッドを持っています。このメソッドは、サービスバスのメッセージキュー(https://azure.microsoft.com/en-us/services/service-bus/)に新しいメッセージが表示されたときに実行されます。
Create
の5つのタスクに対するすべてのコールに対して、並行して実行できる並行タスクの総数を制限しようとしています。
私のコードでは、Parallel.ForEachは何もしないようです。実行中の同時並行タスクの制限
mutex.WaitOne();
if(curretNumTasks < MaxTasks)
{
tasks.Add(makePdfAsync(form));
}
mutex.ReleaseMutex();
を、それは非常に遅く、サービスバススローを行います
私はこのようなmakePdfAsync()
呼び出しの周りにミューテックス/ロックを追加しようとしました。
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;
}
}
}
}
TL; DR。 Create
は、クラスのメソッドであり、同時に多くのインスタンスで呼び出されます。同時実行性は2倍です。 Create
の複数回の呼び出しと同時に、Create
の各呼び出しの中で、いくつかのタスクが同時に実行されます。
どのようにして1つの時点で実行されているタスクの総数を制限できますか?
'Task.WhenAll(tasks)'に何らかの影響を与えます。したがって、 'Parallel.ForEach'はこのコードでは使用しません。 –
これは2回目の質問ですが、答えは同じです: 'SemaphoreSlim'を使用してください。何らかの理由でこれがあなたのシナリオに当てはまらない場合は、あなたの質問を更新して、なぜこれが当てはまるのかを明確にしてください。 –