【问题标题】:Task.WhenAll return list instead of arrayTask.WhenAll 返回列表而不是数组
【发布时间】:2017-05-24 14:01:19
【问题描述】:

我试图找到解决方案,但找不到。这就是我在这里问的原因。 :)

我有一个任务列表,它有两个项目

List<Task<int>> tasks = new List<Task<int>>();
     tasks.Add(Task.FromResult(1));
          tasks.Add(Task.FromResult(2));

当我调用 await Task.WhenAll(tasks) 时,它返回 int[] 但我希望它应该返回 List&lt;int&gt;。如下:

List<int> result = await Task.WhenAll(tasks);

得到结果后,我想在列表中添加新项目。

【问题讨论】:

  • 你为什么要那个?
  • 得到结果后,我想在列表中添加新项目。
  • 如何将array 转换为List,使用ToList() 调用,简单
  • 我投了反对票,因为在编写代码或调试时没有进行任何验证,如果 Task 返回类型 T 并且给定 IEnumerable&lt;Task&lt;T&gt;&gt; 中的所有任务都具有相同的类型,那么总是 @ 987654329@,将其解包为T[],现在你的问题是如何将T[] 翻译成List&lt;T&gt;,在上面你提到这不起作用await Task.WhenAll(tasks).ToList(),你真的期望Task.ToList( ) 工作?
  • 我认为这里的想法是省略 await 关键字。如果我有一个返回Task.WhenAllTask&lt;IEnumerable&lt;T&gt; 方法,它将不起作用,因为Task.WhenAll 返回Task&lt;T[]&gt;。当然,您可以等待然后将方法标记为异步,但这效率较低,因为您打开任务只是为了再次包装它。不过,似乎没有办法解决这个问题。

标签: c# asp.net linq task-parallel-library task


【解决方案1】:

你可以写:

List<int> result = (await Task.WhenAll(tasks)).ToList();

这会将数组转换为列表。

不要忘记添加命名空间:

using System.Linq;

【讨论】:

  • 它尝试了这个await Task.WhenAll(tasks).ToList();,但没有成功。但我把括号放在(await Task.WhenAll(tasks)).ToList(); 这样的括号里,它现在可以工作了。谢谢!
  • @Saadi 你用编辑器查看Task.WhenAll(tasks)的返回类型吗,应该是Task类型,不能用ToList()转换成List
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
相关资源
最近更新 更多