并行与串对比

一、早餐的两种做法

1、串行做法

 Console.WriteLine("*******************串行做早餐**********************");
 {
     var StartTime = DateTime.Now;

     BeanPaddles cup = MakingBeanPaddles(3);
     PrintMsg("豆浆做好了!");
     Console.WriteLine("*****************************************");

     Egg eggs = BoiledEgg(3);
     PrintMsg("鸡蛋煮好了!");
     Console.WriteLine("*****************************************");

     YouTiao bacon = MarkingYouTiao(3);
     PrintMsg("油条做好了");
     Console.WriteLine("*****************************************");
     var EndTime = DateTime.Now;
     PrintMsg($"可以吃饭了,用时:{(EndTime - StartTime).TotalMilliseconds}ms!");
 }

2、并行做法

  Console.WriteLine("*******************火力全开做早餐**********************");

  {
      var StartTime = DateTime.Now;
      Task[] tasks = new Task[] {
      Task.Factory.StartNew(() => {
          BeanPaddles cup = MakingBeanPaddles(3);
          PrintMsg("豆浆做好了!");
      }),
       Task.Factory.StartNew(() => {
           Egg eggs = BoiledEgg(3);
      PrintMsg("鸡蛋煮好了!");
      }),
        Task.Factory.StartNew(() => {
          YouTiao bacon = MarkingYouTiao(3);
      PrintMsg("油条做好了");
      })
      };

      await Task.Run(() => Task.WaitAll(tasks));

      Console.WriteLine("*****************************************");
      var EndTime = DateTime.Now;
      PrintMsg($"可以吃饭了,用时:{(EndTime - StartTime).TotalMilliseconds}ms!");
  }

3、效果对比

4、制作过程

  private static YouTiao MarkingYouTiao(int slices)
  {
      PrintMsg("准备制作油条...");
      Task.Delay(3000).Wait();

      PrintMsg($"制做{slices}根油条");
      Task.Delay(3000).Wait();

      return new YouTiao();
  }

  private static Egg BoiledEgg(int howMany)
  {
      //
      PrintMsg("煮鸡蛋...");
      Task.Delay(3000).Wait();
      PrintMsg($"煮{howMany}个鸡蛋");
      Task.Delay(3000).Wait();
      return new Egg();
  }

  private static BeanPaddles MakingBeanPaddles(int num)
  {
      PrintMsg("制作豆浆……");
      Task.Delay(3000).Wait();
      PrintMsg($"制做{num}L豆浆");
      Task.Delay(3000).Wait();

      return new BeanPaddles();
  }

二、使用举例

1、效果

2、代码

 var v = await GetUrlContentLengthAsync();
 PrintMsg(v);
 PrintMsg("123");

  public static async Task<int> GetUrlContentLengthAsync()
  {
      var client = new HttpClient();

      Task<string> getStringTask =
          client.GetStringAsync("https://docs.microsoft.com/dotnet");

      DoIndependentWork();

      string contents = await getStringTask;

      return contents.Length;
  }



三、线程和任务的等待执行

private static void ThreadTest(int taskNum)
{
    List<Thread> threads = new List<Thread>(taskNum);
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int i = 0; i < taskNum; i++)
    {
        int ii = i + 1;
        Thread threadTest1 = new Thread(() =>
        {
            Thread.Sleep(2000);

            Console.WriteLine("Thread {0}结束消耗时间:{1}", ii, watch.ElapsedMilliseconds);
        });
        threads.Add(threadTest1);
        threadTest1.Start();
    }

    while (true)
    {
        if (threads.FindAll(t => t.IsAlive == true).Count == 0)
        {
            Console.WriteLine("监控Thread 结束消耗时间:{0}", watch.ElapsedMilliseconds);
            break;
        }
        else
            Thread.Sleep(1);
    }
}

private static void TaskTest(int taskNum)
{
    List<Task> tasks = new List<Task>(taskNum);
    Stopwatch watch = new Stopwatch();

    watch.Start();
    for (int i = 0; i < taskNum; i++)
    {
        int ii = i + 1;
        var Task1 = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(2000);
            if (ii>8&&ii%2==0)
            {
                throw new Exception("Mark Err:"+ii);
            }
            Console.WriteLine("Task {0}结束消耗时间:{1}", ii, watch.ElapsedMilliseconds);
        });
        Task1.ContinueWith(t =>
        {
            if (t.IsFaulted)
            {
                Console.WriteLine("任务异常退出:"+t.Exception?.InnerException.Message);
            }
            
        });
        tasks.Add(Task1);
    }

    while (true)
    {
        if (tasks.FindAll(t => t.IsCompleted == false).Count == 0)
        {
            Console.WriteLine("监控 Task 结束消耗时间:{0}", watch.ElapsedMilliseconds);
            break;
        }
        else
            Thread.Sleep(1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值