Может кто-нибудь помочь мне со следующим кодом, пожалуйста. в строке:Parallel.Invoke wait, если задачи заняты.
Parallel.Invoke(parallelOptions,() => dosomething(message));
Я хочу, чтобы вызвать до 5 параллельных задач (если есть 5 заняты, ждать следующего доступного, а затем запустить его ... если только 4 заняты, начните 5-й и т.д.)
private AutoResetEvent autoResetEvent1 = new AutoResetEvent(false);
private ParallelOptions parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = 5 };
private void threadProc()
{
queue.ReceiveCompleted += MyReceiveCompleted1;
Debug.WriteLine("about to start loop");
while (!shutdown)
{
queue.BeginReceive();
autoResetEvent1.WaitOne();
}
queue.ReceiveCompleted -= MyReceiveCompleted1;
queue.Dispose();
Debug.WriteLine("we are done");
}
private void MyReceiveCompleted1(object sender, ReceiveCompletedEventArgs e)
{
var message = queue.EndReceive(e.AsyncResult);
Debug.WriteLine("number of max tasks: " + parallelOptions.MaxDegreeOfParallelism);
Parallel.Invoke(parallelOptions,() => dosomething(message));
autoResetEvent1.Set();
}
private void dosomething(Message message)
{
//dummy body
var i = 0;
while (true)
{
Thread.Sleep(TimeSpan.FromSeconds(1));
i++;
if (i == 5 || i == 10 || i == 15) Debug.WriteLine("loop number: " + i + " on thread: " + Thread.CurrentThread.ManagedThreadId);
if (i == 15)
break;
}
Debug.WriteLine("finished task");
}
РЕЗУЛЬТАТЫ пОЛУЧИТЬ СЕЙЧАС:
1) с DoSomething(), как вы его видите выше, я получаю только один, в то время (он ждет)
2) с DoSomething() изменено на ниже, я не получаю ни одной остановки x количество tas кс (не ограничиваясь или повинуясь MaxDegreeOfParallelism
private async Task dosomething(Message message)
{
//dummy body
var i = 0;
while (true)
{
await Task.Delay(TimeSpan.FromSeconds(1));
i++;
if (i == 5 || i == 10 || i == 15) Debug.WriteLine("loop number: " + i + " on thread: " + Thread.CurrentThread.ManagedThreadId);
if (i == 15)
break;
}
Debug.WriteLine("finished task");
}
Что я делаю не так, чтобы получить то, что я хочу сделать?
РЕЗУЛЬТАТ Я ХОЧУ:
в «MyReceiveCompleted», я хочу, чтобы убедиться, что только 5 одновременных задач обработки сообщений, если есть 5 напряженными, ждут один, чтобы стать доступным.
Возможно, семафоры? –
вам нужно взглянуть на 'TaskScheduler'. Создайте свой собственный планировщик для выполнения только 5 задач за раз. –
Вы предоставляете только одно действие 'Action' для' Parallel.Invoke', поэтому параллельное выполнение невозможно. Вы лучше посмотрите на [System.Threading.Task.Dataflow] (https://msdn.microsoft.com/library/system.threading.tasks.dataflow.aspx). – PetSerAl