C#中的Promise.all对应什么?

17

我想从Firebase实时数据库中像这里这里所描述的那样获取来自多个位置的数据,并且我找不到类似于Promise.all的C#等效方法。应该如何正确地实现?


2
除了这里的任何答案,还可以查看这个SO答案解释C#中的Promise等效 - devNull
2个回答

24

你需要的是Task.WhenAll。你应该创建与你想要获取数据的不同位置相对应的任务,然后将它们传递给这个方法。


1
我认为Task.WhenAll类似于Promise.allSettled,而不是Promise.all。据我所知,在.NET中没有类似于Promise.all的东西。 - Sake
这里是应该随答案一起提供的示例。正如@Sake所指出的那样,这更类似于Promise.allSettled而不是Promise.all - 因为静态类型,如果您有具有不同类型TTask<T>实例,像Promise.all这样的东西会导致类型转换,这很笨拙和不安全;最好使用类似Promise.allSettled的东西,并再次等待已经并行运行和解决的任务的结果。一切都很好。 :-) - mindplay.dk

7

进一步说明 @Christos 的回答:

Task.WhenAll 似乎是最接近 Promise.all 的即插即用替代方案。我发现它比我最初想象的更为接近。以下是一个使用 JavaScript Promise.all 实现的示例,您可能希望在 C# 中复制它:

const [ resolvedPromiseOne, resolvedPromiseTwo ] = await Promise.all([ taskOne, taskTwo ]);

在 C# 中,如果它们返回相同的类型,您可以使用 Task.WhenAll 来执行非常类似的操作。

var taskList = new[]
{
  SomeTask(),
  AnotherTask()
};

var completedTasks = await Task.WhenAll(taskList);

// then access them like you would any array
var someTask = completedTasks[0];
var anotherTask = completedTasks[1];

// or just iterate over the array
foreach (var task in completedTasks)
{
  doSomething(task);
}

假设它们都在异步方法/函数中。

这些似乎已经过时或者是针对比我的环境更早版本的.NET。 - Mauricio Gracia Gutierrez
当它们不返回相同的类型时怎么办? - snowfrogdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接