web-dev-qa-db-ja.com

Task.WaitAll()を使用して、待機中のタスクを処理しますか?

理想的には、非ブロッキングモードでタスクを遅延させてから、すべてのタスクが完了するまで待つことです。 Task.Delayによって返されたタスクオブジェクトを追加してからTask.WaitAllを使用しようとしましたが、これは役に立たないようです。この問題をどのように解決すればよいですか?

class Program
{
    public static async void Foo(int num)
    {
        Console.WriteLine("Thread {0} - Start {1}", Thread.CurrentThread.ManagedThreadId, num);

        var newTask = Task.Delay(1000);
        TaskList.Add(newTask);
        await newTask;

        Console.WriteLine("Thread {0} - End {1}", Thread.CurrentThread.ManagedThreadId, num);
    }

    public static List<Task> TaskList = new List<Task>();

    public static void Main(string[] args)
    {
        for (int i = 0; i < 3; i++)
        {
            int idx = i;
            TaskList.Add(Task.Factory.StartNew(() => Foo(idx)));
        }

        Task.WaitAll(TaskList.ToArray());
    }
}
25
derekhh

これはあなたが達成しようとしていることですか?

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication
{
    class Program
    {
        public static async Task Foo(int num)
        {
            Console.WriteLine("Thread {0} - Start {1}", Thread.CurrentThread.ManagedThreadId, num);

            await Task.Delay(1000);

            Console.WriteLine("Thread {0} - End {1}", Thread.CurrentThread.ManagedThreadId, num);
        }

        public static List<Task> TaskList = new List<Task>();

        public static void Main(string[] args)
        {
            for (int i = 0; i < 3; i++)
            {
                int idx = i;
                TaskList.Add(Foo(idx));
            }

            Task.WaitAll(TaskList.ToArray());
            Console.WriteLine("Press Enter to exit...");
            Console.ReadLine();
        }
    }
}

出力:

スレッド10-開始0 
スレッド10-開始1 
スレッド10-開始2 
スレッド6-終了0 
スレッド6-終了2 
スレッド6-終了1 
 Enterキーを押して終了します... 
42
noseratio