C# Task 等待的多种方案

注意:wait没有返回值

一、Result

1、特点

阻塞主线程,直到获取返回结果

2、语法

task.Result

2、案例

Console.WriteLine("开始执行");
Task<int> task = Task.Run<int>(() => {
    Thread.Sleep(1000 * 3);
    return 10;
});
// 获取线程运行的结果用作下面的运算
int result = task.Result;
Console.WriteLine(result + 20);
Console.WriteLine("结束执行");      

 二、Task

1、特点:阻塞主线程(UI)

2、语法

Task.WaitAll(task数组),等待所有task数组任务执行结束后,执行后面的任务

Task.WaitAny(task数组),等待任一task数组任务执行结束后,执行后面的任务

3、案例

private void btnAsyn_Click(object sender, EventArgs e)
{   
    List<Task> tasks = new List<Task>();

    Console.WriteLine("开始执行");
    Console.WriteLine("准备工作1");
    Console.WriteLine("准备工作2");
    Console.WriteLine("准备工作3");
    TaskFactory factory = new TaskFactory();
    tasks.Add(factory.StartNew(() => this.Print("张三","产能")));
    tasks.Add(factory.StartNew(() => this.Print("李四","人力")));
    tasks.Add(factory.StartNew(() => this.Print("王五","用户")));
    tasks.Add(factory.StartNew(() => this.Print("李二","权限")));
    Task.WaitAny(tasks.ToArray());
    Console.WriteLine("已经完成部分任务,可以休息一下");
    Task.WaitAll(tasks.ToArray());
    Console.WriteLine("已经完成全部任务,拿钱走人");
    Console.WriteLine("结束执行");
}
private void Print(String name, String work) {
    Random random = new Random();
    Console.WriteLine($"开始--{name},负责{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    Thread.Sleep(500 * random.Next(2,6));
    Console.WriteLine($"结束--{name},负责{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}

 三、TaskFactory

1、特点

不阻塞主线程

2、语法

factory.ContinueWhenAll(tasks.ToArray(),(obj)=>{}),创建延续任务,该任务在指定的一组任务,完成后执行

factory.ContinueWhenAny(tasks.ToArray(),(obj)=>{}),创建延续任务,它在指定的一组任务,任何任务完成后执行

3、案例

private void btnInvoke_Click(object sender, EventArgs e)
{
    Console.WriteLine($"开始准备工作1,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    Console.WriteLine($"开始准备工作2,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    Console.WriteLine($"开始准备工作3,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");

    TaskFactory factory = new TaskFactory();
    List<Task> tasks = new List<Task>();

    tasks.Add(factory.StartNew(() => this.Print("张三", "产能")));
    tasks.Add(factory.StartNew(() => this.Print("李四", "人力")));
    tasks.Add(factory.StartNew(() => this.Print("王五", "用户")));
    tasks.Add(factory.StartNew(() => this.Print("李二", "权限")));

    // 创建延续Task,它将在指定的一组任务任何任务完成后,执行
    factory.ContinueWhenAny(tasks.ToArray(), (obj) => {
        Console.WriteLine("有同学已经完成任务了,请其他同学继续努力,大家加油!");
    });

    //  创建延续任务,该任务在指定的一组任务完成后,执行
    factory.ContinueWhenAll(tasks.ToArray(), (obj) => {
        Console.WriteLine($"结束工作,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")},{obj} ");
    });
}

public void Print(string name, string work) {
    Random rnd = new Random();
    Console.WriteLine($"{name}开启, 负责:{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    Thread.Sleep(500*rnd.Next(1, 9));
    Console.WriteLine($"{name}结束,负责:{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}

4、传递值

private void btnInvoke_Click(object sender, EventArgs e)
{
    Console.WriteLine($"开始准备工作1,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    Console.WriteLine($"开始准备工作2,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    Console.WriteLine($"开始准备工作3,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");

    TaskFactory factory = new TaskFactory();
    List<Task> tasks = new List<Task>();

    tasks.Add(factory.StartNew((obj) => this.Print("张三", "产能"),"张三"));
    tasks.Add(factory.StartNew((obj) => this.Print("李四", "人力"), "李四"));
    tasks.Add(factory.StartNew((obj) => this.Print("王五", "用户"), "王五"));
    tasks.Add(factory.StartNew((obj) => this.Print("李二", "权限"), "李二"));

    // 创建延续Task,它将在指定的一组任务任何任务完成后,执行
    factory.ContinueWhenAny(tasks.ToArray(), (obj) => {
        Console.WriteLine($"{obj.AsyncState}同学已经完成任务了,请其他同学继续努力,大家加油!");
    });

    //  创建延续任务,该任务在指定的一组任务完成后,执行
    factory.ContinueWhenAll(tasks.ToArray(), (obj) => {
        Console.WriteLine($"结束工作,当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")},{obj} ");
    });
}

public void Print(string name, string work) {
    Random rnd = new Random();
    Console.WriteLine($"{name}开启, 负责:{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    Thread.Sleep(500*rnd.Next(1, 9));
    Console.WriteLine($"{name}结束,负责:{work},当前线程:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}

 

posted @ 2025-07-03 21:36  市丸银  阅读(190)  评论(0)    收藏  举报