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() 将失效,这是为什么呢?不太懂。

  • 相关阅读:
    pthread_join()
    linux nc
    gcc编译线程程序需带-lpthread选项(否则出错:undefined reference to `pthread_create')
    Makefile中的$(addprefix),添加前缀,指定目标生成目录
    makefile里的Phony
    鱼书学习笔记:激活函数层的实现
    鱼书学习笔记:输出层
    鱼书学习笔记:参数优化
    鱼书学习笔记:利用numpy实现三层神经网络
    鱼书学习笔记:损失函数
  • 原文地址:https://www.cnblogs.com/cinlap/p/12342217.html
Copyright © 2011-2022 走看看