我有一个WCF服务和合同我宁愿不改变(尽管我必须这样做):
[OperationContract]
PackageDto GetPackage(int id);
并且有服务:
public PackageDto GetPackage(int id)
{
var foo1 = FooData.GetFoo1(id);
var foo2 = FooData.GetFoo2(id);
var foo3 = FooData.GetFoo3(id);
var bar1 = FooLogic.CalculateBar(foo1, foo2, foo3);
var bar2 = FooLogic.CalculateBar(foo1, foo2);
return new PackageDto(){ Bar1 = bar1, Bar2 = bar2 };
}
我正在进行3次独立的数据调用以获取 foos 。我觉得我可以同时运行 foo 操作并等待所有结果。然后像往常一样继续。我在考虑 async / await ,但我不确定这是不是可行的方法。毕竟,我们首先谈论并行运行的东西,而不是异步。 Foo 方法不是" true"异步方法,它们会阻止线程,这就是为什么我感到困惑。这就是我的想法:
public PackageDto GetPackage(int id)
{
return Task.Run(async () =>
{
var tasks = new List<Task>();
var foo1Task = Task.Run(() => FooData.GetFoo1(id));
var foo2Task = Task.Run(() => FooData.GetFoo2(id));
var foo3Task = Task.Run(() => FooData.GetFoo3(id));
tasks.Add(foo1Task);
tasks.Add(foo2Task);
tasks.Add(foo3Task);
await Task.WhenAll(tasks);
var bar1 = FooLogic.CalculateBar(foo1Task.Result, foo2Task.Result, foo3Task.Result);
var bar2 = FooLogic.CalculateBar(foo1Task.Result, foo2Task.Result);
return new PackageDto(){ Bar1 = bar1, Bar2 = bar2 };
}).Result;
}
你会做什么?
答案 0 :(得分:0)
当我需要并行运行时,我已经使用了Task.WaitAll:
Task foo1Task = Task.Factory.StartNew(() => FooData.GetFoo1(id));
Task foo2Task = Task.Factory.StartNew(() => FooData.GetFoo2(id));
Task foo3Task = Task.Factory.StartNew(() => FooData.GetFoo3(id));
Task.WaitAll(foo1Task, foo2Task, foo3Task);