以匿名类型聚合任务

时间:2016-02-20 11:52:07

标签: c# asynchronous

我花了几个小时查看clojurescript代码,并尝试将其使用的一些概念应用于C#。我经常发现我想以匿名类型聚合某些独立任务的结果,然后进行JSON序列化。

我想尝试保持我的代码功能,所以我最终写了这样的东西

return new 
 {
            A = await CallServiceA(...),
            B = await Task.WhenAll(someData.Select(Task.Factory.Create(()=>CallServiceB(....))
            C = await CallServiceC(...)
 }

但是,看起来运行时将按顺序填充这些属性,这意味着它将首先填充A,然后填充B,然后填充C.

有什么方法可以让属性并行填充,并且仍然使用如上所述的紧凑语法,而不必单独声明和启动任务,并等待结果如下:

var taskA = Task.Create...
var taskB = Task.WhenAl...
var taskC = Task.Create...
 return new 
     {
                A = await taskA,
                B = await taskB,
                C = await taskC
     }

1 个答案:

答案 0 :(得分:1)

代码段2是正确的,代码片段1确实是顺序的(WhenAll输入除外)。如果要声明任务是独立的,则声明使用表单编号2的方式。

还要记住await无法启动任务。它等待已经运行的任务。