我正在尝试重构一些代码,以通过并行实现更高的吞吐量。我将所有的基本重构都进行到了对线程安全的最低限度的单次调用。我的方法有多个参数:

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()兼容的最简单解决方案是什么?

最佳答案

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

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

10-05 23:32