C# 转换IEnumerable<;任务<;T>&燃气轮机;异步地等待每个任务
今天我想知道如何通过等待每个任务来转换任务列表。 考虑下面的例子:C# 转换IEnumerable<;任务<;T>&燃气轮机;异步地等待每个任务,c#,linq,task-parallel-library,async-await,C#,Linq,Task Parallel Library,Async Await,今天我想知道如何通过等待每个任务来转换任务列表。 考虑下面的例子: private static void Main(string[] args) { try { Run(args); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); Console.Re
private static void Main(string[] args)
{
try
{
Run(args);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
}
static async Task Run(string[] args)
{
//Version 1: does compile, but ugly and List<T> overhead
var tasks1 = GetTasks();
List<string> gainStrings1 = new List<string>();
foreach (Task<string> task in tasks1)
{
gainStrings1.Add(await task);
}
Console.WriteLine(string.Join("", gainStrings1));
//Version 2: does not compile
var tasks2 = GetTasks();
IEnumerable<string> gainStrings2 = tasks2.Select(async t => await t);
Console.WriteLine(string.Join("", gainStrings2));
}
static IEnumerable<Task<string>> GetTasks()
{
string[] messages = new[] { "Hello", " ", "async", " ", "World" };
for (int i = 0; i < messages.Length; i++)
{
TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
tcs.SetResult(messages[i]);
yield return tcs.Task;
}
}
private static void Main(字符串[]args)
{
尝试
{
运行(args);
Console.ReadLine();
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
Console.ReadLine();
}
}
静态异步任务运行(字符串[]args)
{
//版本1:不编译,但会增加开销和列表开销
var tasks1=GetTasks();
List gainStrings1=新列表();
foreach(任务1中的任务)
{
gainStrings1.Add(等待任务);
}
Console.WriteLine(string.Join(“,gainStrings1));
//版本2:不编译
var tasks2=GetTasks();
IEnumerable gainStrings2=tasks2.Select(异步t=>wait t);
Console.WriteLine(string.Join(“,gainStrings2));
}
静态IEnumerable GetTasks()
{
string[]messages=new[]{“Hello”、“”、“async”、“”、“World”};
for(int i=0;i
我想在没有foreach的情况下转换任务列表,但是匿名函数语法和常用函数语法都允许我做foreach所做的事情
我是否必须依赖我的foreach和列表
,或者有没有办法让它与IEnumerable及其所有优点一起工作?这是怎么回事:
await Task.WhenAll(tasks1);
var gainStrings = tasks1.Select(t => t.Result).ToList();
等待所有任务结束,然后提取结果。如果你不在乎它们是按什么顺序完成的,这是理想的
编辑2:
更好的方法是:
var gainStrings = await Task.WhenAll(tasks1);
为什么第二个不编译?错误信息是什么?如果在Select
之后添加缺少的ToList()
,它会编译吗?这是因为它返回IEnumerable
。而不是Select
,您只需使用whalll
的返回值,它将是一个字符串[]
每个任务的所有结果。根据这一点:只有给它一个数组,它才会这样做。你不需要ToArray()
,任务。WhenAll()
也适用于IEnumerable
。。即使您传入一个IEnumerable