具有多个参数的Task.Factory.StartNew

时间:2011-03-04 22:15:03

标签: c# .net-4.0 parallel-processing

我正在尝试重构一些代码,以通过并行性实现更高的吞吐量。我做了所有的基础重构,我在那里进行了极简主义的单一调用,它是线程安全的。我的方法有多个参数:

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()从未使用此代码调用。我有一种感觉,这可能是由于我对lambda表达式的相对缺乏经验,但我也看到使用StartNew()的所有示例都使用委托,或传递一个参数。

使我的多参数调用与Task.Factory.StartNew()兼容的最简单的解决方案是什么?

1 个答案:

答案 0 :(得分:7)

我认为你需要的是命名任务,并获得完成导入的结果。

Task<Domain> someDomainTask = Task<Domain>.Factory.StartNew(() => 
  { 
    return ImportDomain(myConstructor, myAttributes, myDate);
  } 
);
Domain someDomain = someDomainTask.Result;