Task Parallel Library для метода, который имеет несколько параллельных операций и некоторые последовательные - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть метод, содержащий серию вызовов методов. Некоторые из этих вызовов методов могут происходить одновременно, а некоторые должны выполняться последовательно. Какой самый простой способ реализовать это в Task Parallel Library. Все функции очень сложны и требуют меньше секунды для запуска. т.е.

public object MyMethod(InputClass myInput)
{
    var result = method1(myInput);
    var result1 = method2(result);
    var result2 = method3(result);
    var finalResult = method4(result1, result2);
    return finalResult;   
}

Метод1 должен выполняться 1-й, метод2 + метод3 может выполняться параллельно, метод4 должен выполняться последним.

Ответы [ 3 ]

4 голосов
/ 14 апреля 2011

Вы можете использовать ContinueWith для назначения последовательного выполнения, как показано ниже;

 TaskFactory myFactory = new TaskFactory();

 myFactory.StartNew(method).ContinueWith(delegate
 {
    Task t1 = myFactory.StartNew(method2);
    Task t2 = myFactory.StartNew(method3);

    myFactory.ContinueWhenAll(new [] {t1, t2}, method4);
 });
2 голосов
/ 14 апреля 2011

Я полагаю, что это даст требуемый уровень параллелизма, при этом методы 2 и 3 будут выполняться одновременно.

public void MyMethod(InputClass myInput)
{
    TaskFactory<object> t = new TaskFactory<object>();

    var result = method1(myInput);  // Execute Synchronously

    Task<object> t1 = t.StartNew(method2, result); // Create and start new concurrent task
    Task<object> t2 = t.StartNew(method3, result); // Create and start new concurrent task

    t1.Wait(); //Wait for completion
    t2.Wait(); //Wait for completion

    var finalResult = method4(t1.Result, t2.Result);  // Execute Synchronously
}

РЕДАКТИРОВАТЬ: обновление с некоторыми типами, при условии, что все ваши методы возвращают object.

1 голос
/ 14 апреля 2011

Асинхронные блоки в F #, а также новая Async CTP предназначены для четкого и эффективного решения таких проблем с учетом внешней настройки параллельного конвейера.Я знаю, что вы сказали TPL, но я рекомендую вам взглянуть.

async {
   let! result = method1 myInput
   let! result1 = method2 result
   let! result2 = method3 result
   let! finalResult = method4 result1 result2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...