gpt4 book ai didi

c# - 通过等待每个任务异步转换 IEnumerable>

转载 作者:IT王子 更新时间:2023-10-29 04:42:19 26 4
gpt4 key购买 nike

今天我想知道如何通过等待每个任务来转换任务列表。考虑以下示例:

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;
}
}

我想在没有 foreach 的情况下转换我的任务列表,但是匿名函数语法和通常的函数语法都允许我做我的 foreach 做的事情。

我必须依赖我的 foreach 和 List<T> 吗?或者有什么办法让它与 IEnumerable<T> 一起工作及其所有优点?

最佳答案

这个怎么样:

await Task.WhenAll(tasks1);
var gainStrings = tasks1.Select(t => t.Result).ToList();

等待所有任务结束,然后提取结果。如果您不关心它们的完成顺序,这是理想的选择。

编辑2:更好的方法:

var gainStrings = await Task.WhenAll(tasks1);

关于c# - 通过等待每个任务异步转换 IEnumerable<Task<T>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16340498/

26 4 0