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

问题描述 投票:2回答:2

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

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

c# .net-4.0 parallel-processing
2个回答
7
投票

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

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

0
投票

尝试一下,

        var arg = new { i = 123, j = 456 };
        var task = new TaskFactory().StartNew(new Func<dynamic, int>((argument) =>
        {
            dynamic x = argument.i * argument.j;
            return x;
        }), arg, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);
        task.Wait();
        var result = task.Result;
© www.soinside.com 2019 - 2024. All rights reserved.