2011-03-04 185 views
2

我试图重构一些代码以通过并行性实现更多吞吐量。我做了所有的基础重构,以使我的最低限度单一调用成为线程安全的。我的方法需要多个参数:Task.Factory.StartNew具有多个参数

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

回答

6

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

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

Thanks gooch ... This works perfect! – iisystems 2011-03-06 19:38:14