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

    结果:

  • 相关阅读:
    eventbus 备注
    Retrofit 备注
    RxJava 备注
    dagger2 备注
    JVM 备注
    UI控件(UIPickerView)
    Android 知识杂记(MVP模式)
    UI控件(UIToolbar)
    UI控件(UIAlertController)
    UI控件(UIScrollView)
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/7071512.html
Copyright © 2011-2022 走看看