一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - 說說C#的async和await的具體用法

說說C#的async和await的具體用法

2022-01-21 13:54tianmuxia C#

本篇文章主要介紹了說說C#的async和await的具體用法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

C# 5.0中引入了async 和 await。這兩個關鍵字可以讓你更方便的寫出異步代碼。

看個例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MyClass
{
  public MyClass()
  {
    DisplayValue(); //這里不會阻塞
    System.Diagnostics.Debug.WriteLine("MyClass() End.");
  }
  public Task<double> GetValueAsync(double num1, double num2)
  {
    return Task.Run(() =>
    {
      for (int i = 0; i < 1000000; i++)
      {
        num1 = num1 / num2;
      }
      return num1;
    });
  }
  public async void DisplayValue()
  {
    double result = await GetValueAsync(1234.5, 1.01);//此處會開新線程處理GetValueAsync任務,然后方法馬上返回
    //這之后的所有代碼都會被封裝成委托,在GetValueAsync任務完成時調用
    System.Diagnostics.Debug.WriteLine("Value is : " + result);
  }
}

上面在MyClass的構造函數里調用了async關鍵字標記的異步方法DisplayValue(),DisplayValue()方法里執行了一個await關鍵字標記的異步任務GetValueAsync(),這個異步任務必須是以Task或者Task<TResult>作為返回值的,而我們也看到,異步任務執行完成時實際返回的類型是void或者TResult,DisplayValue()方法里await GetValueAsync()之后的所有代碼都會在異步任務完成時才會執行。

DisplayValue()方法實際執行的代碼如下:

?
1
2
3
4
5
6
7
8
9
public void DisplayValue()
{
  System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();
  awaiter.OnCompleted(() =>
    {
      double result = awaiter.GetResult();
      System.Diagnostics.Debug.WriteLine("Value is : " + result);
    });
}

可以看到,async和await關鍵字只是把上面的代碼變得更簡單易懂而已。

程序的輸出如下:

MyClass() End.
Value is : 2.47032822920623E-322

以下是我寫的一個靜態類,可以方便將一個普通Function執行異步調用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public static class TaskAsyncHelper
{
  /// <summary>
  /// 將一個方法function異步運行,在執行完畢時執行回調callback
  /// </summary>
  /// <param name="function">異步方法,該方法沒有參數,返回類型必須是void</param>
  /// <param name="callback">異步方法執行完畢時執行的回調方法,該方法沒有參數,返回類型必須是void</param>
  public static async void RunAsync(Action function, Action callback)
  {
    Func<System.Threading.Tasks.Task> taskFunc = () =>
    {
      return System.Threading.Tasks.Task.Run(() =>
      {
        function();
      });
    };
    await taskFunc();
    if (callback != null)
      callback();
  }
 
  /// <summary>
  /// 將一個方法function異步運行,在執行完畢時執行回調callback
  /// </summary>
  /// <typeparam name="TResult">異步方法的返回類型</typeparam>
  /// <param name="function">異步方法,該方法沒有參數,返回類型必須是TResult</param>
  /// <param name="callback">異步方法執行完畢時執行的回調方法,該方法參數為TResult,返回類型必須是void</param>
  public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback)
  {
    Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=>
      {
        return System.Threading.Tasks.Task.Run(()=>
          {
            return function();
          });
      };
    TResult rlt = await taskFunc();
    if(callback != null)
      callback(rlt);
  }
}

使用很簡單,將方法名作為參數傳進去就行了,最常用的是把很耗時的序列化函數傳進去,以免阻塞UI進程,造成卡頓現象,影響用戶體驗。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/tianmuxia/article/details/17675681

延伸 · 閱讀

精彩推薦
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
主站蜘蛛池模板: 日本剧情片在线播放中文版 | 被黑人同学彻底征服全文小说阅读 | 香蕉在线精品一区二区 | 欧美一区二区三区综合色视频 | 亚洲欧美日韩综合在线播放 | 99操视频| jizz女16处| 秘书喂奶好爽一边 | 无人区在线观看免费视频国语 | 果冻传媒在线播放观看w | 天天综合五月天 | 欧美第一视频 | 吉泽明步高清无码中文 | 91碰碰 | 青草福利视频 | 国产网站免费看 | 国产自拍视频一区 | 欧美xxxxx69 | 亚洲卡一卡2卡三卡4卡无卡三 | 按摩椅play啊太快了h | 亚洲va久久久噜噜噜久久狠狠 | 男人的天堂久久 | 男女全黄h全肉细节文 | 情人梁家辉在线 | 女人特黄大aaaaaa大片 | 久久无码人妻AV精品一区 | 91热爆在线 | 99视频精品全部 在线 | 午夜爱爱片 | 天堂资源8中文最新版 | 亚洲欧美日韩综合在线播放 | 欧美一级艳片视频免费观看 | 成人快插 | 欧美一级乱妇老太婆特黄 | 成人精品一级毛片 | 天天做日日爱 | 我的青梅竹马是消防员2季未增删免费 | 久久中文电影 | 99这里只有精品视频 | 国产三区二区 | 国产精自产拍久久久久久 |