【发布时间】:2013-04-26 18:29:08
【问题描述】:
今天我想知道如何通过等待每个任务来转换任务列表。 考虑以下示例:
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> 一起使用以及它的所有优势?
【问题讨论】:
-
为什么第二个不编译?错误信息是什么?如果在
Select之后添加缺少的ToList(),它会编译吗? -
因为它返回
IEnumerable<Task<string>>。
标签: c# linq task-parallel-library async-await