繁体   English   中英

启动链任务在C#中等待所有结果

[英]Start chain Tasks wait for result all of them in C#

我需要启动链式 Tasks并等待所有Tasks的结果。

List<int> myAsyncWork1()
List<int> myAsyncWork2()
List<int> myAsyncWork3()

var tasks = new Func<Task>[]
{
   () => myAsyncWork1(),
   () => myAsyncWork2(),
   () => myAsyncWork3()
};

await Task.WhenAll(tasks.Select(task => task()).ToArray()); //Async    

完成所有Tasks ,如何获取所有方法的List<int>

您可以简单地使用WhenAll的结果,例如:

Task<List<int>> work1() { ... }
Task<List<int>> work2() { ... }
Task<List<int>> work3() { ... }

async Task DoConcurrentWork()
{
    List<int>[] lists = await Task.WhenAll(work1(), work2(), work3());

    // use lists
}

确保所有任务完成后,可以使用task.Result属性。

var tasksFunc = new Func<Task<List<int>>>[]
{
   () => myAsyncWork1(),
   () => myAsyncWork2(),
   () => myAsyncWork3()
};

var tasks = tasksFunc.Select(func => func());
await Task.WhenAll(tasks);

var allLists = tasks.Select(task => task.Result);  
    private static void Main(string[] args)
    {
        var tasks = new List<Task<List<int>>>(){
            myAsyncWork1(),
            myAsyncWork2(),
            myAsyncWork3()
        };            

        var results = Task.WhenAll(tasks).Result;
        var numbers = results.SelectMany(x => x).ToList();
        Console.WriteLine(string.Join(" ", numbers.Select(x => x.ToString())));            
        Console.ReadKey();
    }

    static Task<List<int>> myAsyncWork1()
    {            
        return Task.Factory.StartNew(() =>
        {
            Console.WriteLine("MyAsyncWork1 started!");
            Thread.Sleep(300);
            Console.WriteLine("MyAsyncWork1 finished!");
            return new List<int>() { 1, 2, 3 };
        });
    }
    static Task<List<int>> myAsyncWork2()
    {
        return Task.Factory.StartNew(() =>
        {
            Console.WriteLine("MyAsyncWork2 started!");
            Thread.Sleep(200);
            Console.WriteLine("MyAsyncWork2 finished!");
            return new List<int>() { 4, 5, 6 };
        }); ;
    }
    static Task<List<int>> myAsyncWork3()
    {
        return Task.Factory.StartNew(() =>
        {
            Console.WriteLine("MyAsyncWork3 started!");
            Thread.Sleep(200);
            Console.WriteLine("MyAsyncWork3 finished!");
            return new List<int>() { 7, 8, 9 };
        });
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM