zoukankan      html  css  js  c++  java
  • 如何启动并等待 Task 运行

    Task.Run + Task.WhenAll

    Task.Run 里边可以搭配 async,所有由 Task.Run 启动起来的 Task 所组成的数组允许被 WhenAll 等待,调用线程(如UI线程)不会阻塞

    List<Task> taskArray = new List<Task>(3);
    
    taskArray.Add(Task.Run(async() =>
    {
        for (var i = 0; i < 3; i++)
        {
            Console.WriteLine("tom saying" + i.ToString());
            await Task.Delay(1500);
        }
    }));
    taskArray.Add(Task.Run(async() =>
    {
        for (var i = 0; i < 3; i++)
        {
            Console.WriteLine("Ant saying" + i.ToString());
            await Task.Delay(1500);
        }
    }));
    taskArray.Add(Task.Run(async() =>
    {
        for (var i = 0; i < 3; i++)
        {
            Console.WriteLine("Tour saying" + i.ToString());
            await Task.Delay(1500);
        }
    }));
    
    Task done = Task.WhenAll(taskArray.ToArray());
    await done.ContinueWith((t) => { Console.WriteLine($"{t.Status}"); });
    Console.WriteLine("All work done");
    

    如果 done 换做 Wait() 来等待的话,就会阻塞调用线程,如果是 UI 线程运行 Wait() 的话界面将冻结

    Task done = Task.WhenAll(taskArray.ToArray());
    done.Wait();
    Console.WriteLine("All work done");
    

    Task.Factory.StartNew + Task.WaitAll();

    如果用 StartNew() 的方法创建并启动 Task,想要获得等待效果方法不能有 async 修饰

    List<Task> taskArray = new List<Task>(3);
    
    taskArray.Add(Task.Factory.StartNew(() =>
    {
        for (var i = 0; i < 30; i++)
        {
            Console.WriteLine("tom saying" + i.ToString());
            Task.Delay(1500);
        }
    }));
    taskArray.Add(Task.Factory.StartNew(() =>
    {
        for (var i = 0; i < 30; i++)
        {
            Console.WriteLine("Ant saying" + i.ToString());
            Task.Delay(1500);
        }
    }));
    taskArray.Add(Task.Factory.StartNew(() =>
    {
        for (var i = 0; i < 30; i++)
        {
            Console.WriteLine("Tour saying" + i.ToString());
            Task.Delay(1500);
        }
    }));
    
    Task.WaitAll(taskArray.ToArray());
    Console.WriteLine("All work done");
    

    注意 Task.Delay() 没有 await 的修饰,如果加入 await/async 的组合运行后 WaitAll() 将失效,这是为什么呢?不太懂。

  • 相关阅读:
    调整心态,夯实基础
    js实现轮播图动画(更新"旋转木马")
    封装简单动画函数-由简到完善
    纯Css绘制三角形箭头三种方法
    JS实现图片''推拉门''效果
    一个基于 canvas 的画板
    Python 控制台进度条的实现
    Flask博客开发——Tinymce编辑器
    Flask博客开发——登录验证码
    用于水和水蒸汽物性计算的Python模块——iapws
  • 原文地址:https://www.cnblogs.com/cinlap/p/12342217.html
Copyright © 2011-2022 走看看