zoukankan      html  css  js  c++  java
  • .Net进阶系列(14)-异步多线程(async和await)(被替换)

    1.  方法名前只有async,但是方法中Task实例前没有await关键字,该方法和普通方法没有什么区别,但是会报一个警告。

     1         #region 情况一
     2         /// <summary>
     3         /// 当只有async,没有await时,方法会有个警告
     4         /// 和普通的多线程方法没有什么区别
     5         /// </summary>
     6         private static async void Test1()
     7         {
     8             //主线程执行
     9             Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
    10             //启动新线程完成任务
    11             Task task = Task.Run(() =>
    12             {
    13                 Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
    14                 Thread.Sleep(3000);
    15                 Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
    16             });
    17             //主线程执行
    18             Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
    19         }
    20         #endregion

    结果:

    2. 用法:方法名前加async,如果方法无返回值,用async Task 代替async void ,await放到Task实例前面,表示执行完Task线程后,方可执行后面的操作。

     1        #region 情况三
     2         /// <summary>
     3         /// 无返回值  async Task == async void
     4         /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用,async Void 不行
     5         /// </summary>
     6         private static async Task Test3()
     7         {
     8             //主线程执行
     9             Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
    10             //启动新线程完成任务
    11             Task task = Task.Run(() =>
    12             {
    13                 Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
    14                 Thread.Sleep(3000);
    15                 Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
    16             });
    17             await task;   //等待子线程执行完毕,方可执行后面的语句
    18             Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
    19         }
    20         #endregion

    结果:

    3.带返回值的Task,要使用返回值,一定要等子线程计算完毕才行

     1         #region 情况四
     2         /// <summary>
     3         /// 带返回值的Task,要使用返回值,一定要等子线程计算完毕才行
     4         /// </summary>
     5         /// <returns></returns>
     6         private static async Task<long> Test4()
     7         {
     8             //主线程执行
     9             Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
    10             long result = 0;
    11             //启动新线程完成任务
    12             Task task = Task.Run(() =>
    13             {
    14                 for (long i = 0; i < 100; i++)
    15                 {
    16                     result += i;
    17                 }
    18             });
    19             await task;   //等待子线程执行完毕,方可执行后面的语句
    20             Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
    21             Console.WriteLine("result:{0}", result);
    22             return result;
    23         }
    24         #endregion

    结果:

  • 相关阅读:
    有关同时包含<winsock2.h>与<windows.h>头文件的问题
    如何使用微软提供的TCHAR.H头文件?
    下面的程序在VC6通过,在VS2008不能,错误信息都是“不能将参数……从const char[]转换为LPCWSTR”
    Android开发学习日志(四)
    爬虫开发(一)
    java集合源码详解
    Paxos算法
    linux 常用命令
    Bitmap的原理和应用
    Flink Checkpoint 问题排查实用指南
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/7071512.html
Copyright © 2011-2022 走看看