Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换IEnumerable<;任务<;T>&燃气轮机;异步地等待每个任务_C#_Linq_Task Parallel Library_Async Await - Fatal编程技术网

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