Task的阻塞方式和任务延续

//【1】回顾之前使用Thread多个子线程执行时阻塞的方法
static void Method2()
{
    Thread thread1 = new Thread(() =>
    {
        Thread.Sleep(2000);
        Console.WriteLine("Child Thread (1)......");
    });
    Thread thread2 = new Thread(() =>
    {
        Thread.Sleep(1000);
        Console.WriteLine("Child Thread (2)......");
    });
    thread1.Start();
    thread2.Start();
    //...

    thread1.Join();//让调用线程阻塞
    thread2.Join();
    //如果有很多的thread,是不是也得有很多的Join?还有,我们只希望其中一个执行完以后,后面的其他线程就能执行,这个也做不了!

    Console.WriteLine("This is Main Thread!");
}
//【2】Task各种【阻塞】方式(3个)
static void Method3()
{
    Task task1 = new Task(() =>
     {
         Thread.Sleep(1000);
         Console.WriteLine($"Task1子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
     });
    task1.Start();
    Task task2 = new Task(() =>
    {
        Thread.Sleep(2000);
        Console.WriteLine($"Task2子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
    });
    task2.Start();

    第1种方式:挨个等待和前面一样
    //task1.Wait();
    //task2.Wait();

    第2种方式:等待所有的任务完成    【推荐】
    //Task.WaitAll(task1, task2);

    //第3种方式:等待任何一个完成即可  【推荐】
    Task.WaitAny(task1, task2);

    Console.WriteLine("主线程开始运行!Time=" + DateTime.Now.ToLongTimeString());
}
//Task任务的延续:WhenAll 希望前面所有任务执行完毕后,再继续执行后面的线程,和前面相比,既有阻塞,又有延续。
static void Method4()
{
    Task task1 = new Task(() =>
    {
        Thread.Sleep(1000);
        Console.WriteLine($"Task1子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
    });
    task1.Start();
    Task task2 = new Task(() =>
    {
        Thread.Sleep(2000);
        Console.WriteLine($"Task2子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
    });
    task2.Start();

    //线程的延续(主线程不等待,子线程依次执行,如果你需要主线程也按照子线程的顺序来,请你自己把主线程的任务放到延续任务中就可以)
    Task.WhenAll(task1, task2).ContinueWith(task3 =>
     {
         //在这里可以编写你需要的业务...

         Console.WriteLine($"Task3子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
     });

    Console.WriteLine("主线程开始运行!Time=" + DateTime.Now.ToLongTimeString());
}
//Task的延续:WhenAny
static void Method5()
{
    Task task1 = new Task(() =>
    {
        Thread.Sleep(1000);
        Console.WriteLine($"Task1子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
    });
    task1.Start();
    Task task2 = new Task(() =>
    {
        Thread.Sleep(2000);
        Console.WriteLine($"Task2子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
    });
    task2.Start();

    //线程的延续(主线程不等待,子线程任何一个执行完毕,就会执行后面的线程)
    Task.WhenAny(task1, task2).ContinueWith(task3 =>
    {
        //在这里可以编写你需要的业务...

        Console.WriteLine($"Task3子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
    });

    Console.WriteLine("主线程开始运行!Time=" + DateTime.Now.ToLongTimeString());
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值