我应该使用async / await同时运行3个操作吗?

时间:2018-06-08 14:44:46

标签: c# .net async-await task-parallel-library multitasking

我有一个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;
}  

你会做什么?

1 个答案:

答案 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);