今日、タスクのリストをそれぞれ待って変換する方法を知りました。Transform IEnumerable <Task<T>>各タスクを待って非同期に
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();
待っ:これについて何
なぜもう一つはコンパイルされませんか?エラーメッセージとは何ですか? 'Select'の後ろに' ToList() 'を追加するとコンパイルされますか?それは 'IEnumerable>'を返すので、 –
です。 – GameScripting