使用Async-Await或Process.Start

时间:2016-08-08 09:35:14

标签: c# multithreading async-await task-parallel-library process.start

我们计划创建C#负载测试框架,我们可以对基于IO的API(缓存/数据库/文件)进行并发调用,从而在负载下测试它们,以下是可能的选项:

  1. 使用Async-Await和调度程序提示TaskCreationOptions.LongRunning,从而确保我们为每个已启动的请求background process,从而在负载下真正测试我们的API。此外,我们还会以有效的方式帮助我们汇总最终结果,因为我们会获得每个Task返回的帖子Async来电的详细信息,类似于:

    void Main()
    {
    
       List<Task<long>> taskList = new List<Task<long>>();
    
       for (int i = 0; i < 500; i++)
       {
          taskList.Add(TestLoadAsync());
       }
    
       Task.WaitAll(taskList.ToArray());
    
       long averageTime  = taskList.Average(t => t.Result);
    
    }
    
    public static async Task<long> TestLoadAsync()
    {
       // Returns the total time taken using Stop Watch in the same module
          return await Task.Factory.StartNew(() => // Call IO API,
                                           TaskCreationOptions.LongRunning);
    }
    
  2. 第二个选项正在使用System.Diagnostics Process.Start,如下所示:

    void Main()
    {   
    
       for (int i = 0; i < 500; i++)
      {
        System.Diagnostics.Process.Start("LoadAPI.exe");
      }
    }
    
    "LoadAPI.exe"
    
    public class LoadAPI
    { 
      public static void Main()
      {
         LoadAPI api = new LoadAPI();
         api.TestLoadAPI();
    
         // Register the details of stop watch time in database, for further           
            analysis             
      }
    
      public void TestLoadAPI()
      {
          // Call IO API
      }
    }
    
  3. 需要回答的重要问题包括:

    • 哪种方法更好,为什么?
    • 标准负载测试框架是否使用类似的策略?

    我发布问题是为了理解各种观点并在我的组织中进行深入讨论,根据我的理解,我们将使用:

    • Async-Await,因为这是基于IO的并发呼叫的自然机制
    • 在使用Process.Start时,我们可能会通过创建一个昂贵的进程来加载操作系统,这个进程会相互挨饿而不是IO调用的最佳机制
    • 标准负载测试框架使用Async -Await
    • 创建的后台进程
    • Windows作为操作系统,是一种多线程架构,使用process.start调用多个进程并不是加载测试的正确方法

    请分享您的观点,以便更好地了解该主题

0 个答案:

没有答案