代码之家  ›  专栏  ›  技术社区  ›  Neo

如何使用c的async方法使用task.waitall#

  •  0
  • Neo  · 技术社区  · 6 年前

    我已经用过 Task.WaitAll 里面 HomeController Async method.

    但是 韦特尔 不等待完成的执行 async methods .

    有谁能帮我知道我在这里做错了什么,而不是等着看下一句话吗?

    家庭控制器.cs

    private List<Task> taskList = new List<Task>();   
    public ActionResult Index()
     {
    
     for (i=0 ;i<5;i++)
                {
                SendMessages();
                }
    
                 Task.WaitAll(taskList.ToArray());
                 // call demo method
        }
    
    
    
     private async Task SendMessages()
             {
              var task = Task.Factory.StartNew(() => ProcessMessages()
               taskList.Add(task);
             }
    
    
    
    private async Task ProcessMessages()
              {
               while (run for 10 minutes)
                {
                 // data save
                }
              }
    

    我有 added task into taskList 并使用 Task.WaitAll(taskList.ToArray()); 等待所有任务完成,然后调用demo方法,但不是等待并执行整个循环,而是在 task.waitall(tasklist.toarray()); 为什么要执行调用演示方法?我做错了什么?有人能帮忙吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Douglas    6 年前

    Task.Factory.StartNew 不应用于启动异步操作,因为它不会展开返回的 Task ,然后返回一个新的 任务 一旦异步操作启动(或者更准确地说,完成它的同步部分),这就完成了。你应该使用 Task.Run 相反。

    此外, SendMessages 不应是异步的。然而, Index 应该是,允许您使用异步 WhenAll 而不是封锁 WaitAll .

    private List<Task> taskList = new List<Task>();
    
    public async Task<ActionResult> Index()
    {
         for (i = 0; i < 5; i++)
         {
             SendMessages();
         }
    
         await Task.WhenAll(taskList);
         // call demo method
    }
    
    private void SendMessages()
    {
        var task = Task.Run(() => ProcessMessagesAsync());   // here
        taskList.Add(task);
    }
    
    private async Task ProcessMessagesAsync()
    {
        while (run for 10 minutes)
        {
            // data save
        }
    }