asAll WhenAll in WhenAll

时间:2014-06-06 12:54:30

标签: c# .net task async-await

我试图并行运行一批请求,并等待这些批次完成。我在WhenAll中想到WhenAll,但是当我在我的主项目中执行此操作时,项目挂起,CPU达到100%并且我的RAM开始填满。

我做了一个更简单的程序试图重现这个问题,但问题并不存在。使用这种类型的流程在我的主项目中难以理解这一事实让我想知道是否有更简单的方法来模拟多层parralelized和顺序请求。我正在寻找复杂异步的最佳实践,谢谢。

以下是更简单的程序:

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

namespace AsyncTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start Test, press key ...");
            Console.ReadKey();

            new TaskParralelizor()
                .Run()
                .Wait();

            Console.WriteLine("Test Completed ...");
            Console.ReadKey();
        }
    }

    public class TaskParralelizor
    {
        public async Task Run()
        {
            var parralizedTasks = new List<Task>
                {
                    OneAsync(),
                    TwoAsync()
                };
            await Task.WhenAll(parralizedTasks);
        }

        public Task OneAsync()
        {

            var tasks = new List<Task>();
            tasks.Add(new FakeFetch().FetchAsync("OneAsync() 1", 2500));
            tasks.Add(new FakeFetch().FetchAsync("OneAsync() 2", 4000));
            return Task.WhenAll(tasks);
        }

        public Task TwoAsync()
        {
            var tasks = new List<Task>();
            tasks.Add(new FakeFetch().FetchAsync("TwoAsync() 1", 2000));
            tasks.Add(new FakeFetch().FetchAsync("TwoAsync() 2", 5000));
            return Task.WhenAll(tasks);
        }
    }

    public class FakeFetch
    {
        public Task FetchAsync(string methodName, int time)
        {
            return Task.Run(() =>
                {
                    Thread.Sleep(time);
                    Console.WriteLine(methodName + " completed !");
                });
        }
    }
}

0 个答案:

没有答案