7

Пожалуйста, знайте, что я знаю, что Parallel.Invoke() предназначен для синхронизации задач. Мой вопрос таков:Parallel.Invoke(), не дожидаясь завершения выполнения

Есть ли способ вызвать анонимный метод, используя что-то вроде Parallel.Invoke, в котором вызов НЕ ждет завершения выполнения?

Я думал, что вся точка параллельного выполнения (или параллельного вызова) НЕ должна ждать завершения задачи. Если вы хотите дождаться завершения фрагмента кода, вместо использования Parallel.Invoke, почему бы просто не вызвать код напрямую? Наверное, я просто не понимаю, что такое Параллель. Документация просто говорит , что и, но не упоминает каких-либо прецедентов, когда это было бы более полезно, чем просто вызвать код напрямую.

ответ

9

Если вы хотите дождаться завершения фрагмента кода, вместо использования Parallel.Invoke, почему бы просто не вызвать код напрямую?

Хорошо, что вы бы назвали Parallel.Invoke с несколькими работами. Если вы выполните эти части работ последовательно, это (вероятно) займет больше времени, чем выполнение их параллельно.

«Выполнять параллельно» - это не то же самое, что «выполнить в фоновом режиме» - вы, кажется, ищете последнее, но это не то, о чем Parallel.Invoke.

Если вы просто хотите запустить задачи, используйте Task.Run (или Task.Factory.StartNew до .NET 4.5). Parallel.Invoke предназначен для выполнения кучу действий параллельно, но затем ждет завершения этих параллельных действий.

В качестве конкретного примера, вы можете выполнить сортировку, секционирования, затем рекурсивно сортирует обе стороны оси параллельно. При этом будут использоваться несколько ядер, но вы, как правило, все еще хотите подождать, пока весь этот вид не завершится, прежде чем продолжить.

+1

Ты прав, я был под впечатлением, что выполнение параллельно одно и то же как выполняется в фоновом режиме. Можете ли вы рассказать мне, какая разница и как это относится к Parallel.Invoke? Или укажите мне ресурс, который может помочь мне понять разницу? – Anshul

+2

@Anshul: Выполнение параллельно - это просто использование нескольких ядер для достижения цели. Это * может быть сделано в режиме «огонь и забухание», но это не всегда. См. Мое редактирование для конкретного примера, когда полезно распараллелить работу, не делая ее фоновой задачей. –

+0

Если у меня есть 2 Parallel.Invokes в sequeunce, не будет ли второй ждать, пока первый из них не будет вызван? В этом случае, как бы вы выполняли несколько фрагментов кода параллельно с помощью Parallel.Invoke? – Anshul

5

Просто оберните свой Parallel.Invoke звонок в Task, если вы не хотите ждать завершения.

Task.Factory.StartNew(() => 
    { 
     Parallel.Invoke(<one or more actions>); 
    }); 
+0

Что делать, если я должен был делать Task.Factory.StartNew (() => {// делать что-то}); вместо использования Parallel.Invoke? Разве это не будет иметь тот же эффект, поскольку вы начинаете новую задачу? – Anshul

+1

Конечно, вам нужно будет начать новую задачу для каждого действия, которое вы хотите выполнить параллельно. – Moho

+0

Понял. Похоже, я неправильно понял причину Parallel.Invoke(). – Anshul

3

Вы ищете что-то в этом роде?

async Task ParallelInvokeAsync(Action[] actions) 
{ 
    var tasks = actions.Select(a => Task.Run(a)); 
    await Task.WhenAll(tasks); 
} 

исполнение фона: исполнение

ParallelInvokeAsync(actions); 
MessageBox.Show("I'm working"); 

Фон с блокированием, очень похожий на Parallel.Invoke:

ParallelInvokeAsync(actions).Wait(); 
MessageBox.Show("I'm dome working"); 
+0

Я полагаю, что это сработает. Мне просто нужно что-то, что использует TPL и выполняет кусок кода * параллельно с текущей строкой исполнения *. Под этим я подразумеваю, что текущая строка выполнения не должна ждать завершения параллельной задачи. Task.Factor.StartNew (() => {}) удовлетворяет этому требованию. Я хотел, чтобы вызов был сукцинт главным образом. – Anshul

+0

@ Аншуль, как вы его используете, зависит от вызывающего. Я обновил ответ, чтобы проиллюстрировать его. Теоретически 'Task.Factory.StartNew (() => Parallel.Invoke (действия))' создаст еще один поток, чем 'ParallelInvokeAsync (действия)' выше. – Noseratio

Смежные вопросы