Task.Factory.StartNew с несколькими параметрами - PullRequest
2 голосов
/ 05 марта 2011

Я пытаюсь реорганизовать некоторый код для достижения большей пропускной способности за счет параллелизма. Я сделал весь базовый рефакторинг туда, где у меня был минималистичный одиночный вызов, который был бы поточно-ориентированным. Мой метод принимает несколько параметров:

private Domain ImportDomain(ConstructorInfo domainConstructor,
                            string[] domainAttributes, DateTime importDate)
{
    ...
}

У меня есть рабочий код, который повторяет вызовы этого метода, просто так:

ImportDomain(myConstructor, myAttributes, myDate);

Все прекрасно работает, прежде чем я пытаюсь добавить параллелизм.

Я думал, что просто смогу сделать это:

Task<Domain>.Factory.StartNew(() =>
    ImportDomain(myConstructor, myAttributes, myDate)
);

и добавьте блок catch для обработки любого AggregateException, который может быть выдан.

Однако я обнаружил, что ImportDomain() никогда не вызывался с этим кодом, хотя выполнялась строка StartNew(). У меня такое чувство, что это может быть связано с моей относительной неопытностью в отношении лямбда-выражений, но я также вижу, что все примеры, использующие StartNew(), либо используют делегаты, либо передают один параметр.

Как проще всего сделать мой многопараметрический вызов совместимым с Task.Factory.StartNew()?

1 Ответ

7 голосов
/ 05 марта 2011

Я думаю, что вам нужно назвать задачу и получить результат выполненного импорта.

Task<Domain> someDomainTask = Task<Domain>.Factory.StartNew(() => 
  { 
    return ImportDomain(myConstructor, myAttributes, myDate);
  } 
);
Domain someDomain = someDomainTask.Result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...