亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#異步編程詳解

2019-10-29 21:14:23
字體:
來源:轉載
供稿:網友

前言

本節主要介紹異步編程中Task、Async和Await的基礎知識。

什么是異步?

異步處理不用阻塞當前線程來等待處理完成,而是允許后續操作,直至其它線程將處理完成,并回調通知此線程。

異步和多線程

相同點:避免調用線程阻塞,從而提高軟件的可響應性。

不同點:

異步操作無須額外的線程負擔,并且使用回調的方式進行處理,在設計良好的情況下,處理函數可以不必使用共享變量(即使無法完全不用,最起碼可以減少 共享變量的數量),減少了死鎖的可能。C#5.0 .NET4.5 以后關鍵字Async和Await的使用,使得異步編程變得異常簡單。

多線程中的處理程序依然是順序執行,但是多線程的缺點也同樣明顯,線程的使用(濫用)會給系統帶來上下文切換的額外負擔。并且線程間的共享變量可能造成死鎖的出現。

異步應用場景及原理

異步主要應用于IO操作,數據庫訪問,磁盤操作,Socket訪問、HTTP/TCP網絡通信

原因:對于IO操作并不需要CPU進行過多的計算,這些數據主要通過磁盤進行處理,如果進行同步通信無法結束,需要創建更多的線程資源,線程的數據上下文頻繁的切換也是對資源的浪費,針對IO操作不需要單獨的分配一個線程來處理。

舉例說明:

操作:服務器接收HTTP請求對數據庫進行操作然后返回

同步處理請求的線程會被阻塞,異步處理請求的線程不會阻塞。

C#,異步編程

任務

在使用任務之前,針對線程的調用大多都用線程池提供的靜態方法QueueUserWorkItem,但是這個函數有很多的限制,其中最大的問題就是沒有內部機制可以讓開發者知道操作在什么時候完成,也沒有機制在操作完成時獲取返回值,微軟為了解決這個問題引入了任務的概念。

首先構造一個Task<TResult>對象,并為TResult傳遞返回值,開始任務之后等待它并回去結果,示例代碼:

 static void Main(string[] args)    {      Console.WriteLine("開始進行計算");      // ThreadPool.QueueUserWorkItem(Sum, 10);      Task<int> task = new Task<int>(Sum, 100);      task.Start();      //顯示等待獲取結果      task.Wait();      //調用Result時,等待返回結果      Console.WriteLine("程序結果為 Sum = {0}",task.Result);      Console.WriteLine("程序結束");      Console.ReadLine();    }    public static int Sum(object i)    {      var sum = 0;      for (var j = 0; j <= (int) i; j++)      {        Console.Write("{0} + ",sum);        sum += j;      }      Console.WriteLine( " = {0}",sum);      return sum;    }

除了wait等待單個任務外,task還提供了等待多個任務,WaitAny和WaitAll,它阻止調用線程,直到數組中所有的Task對象完成。

取消任務

任務的取消同樣使用的是.NET Framework的標準取消操作模式,首先需要創建一個CancellationTokenSource對象,然后在函數中加入參數CancellationToken,將CancellationTokenSource的Token傳遞給方法,然后調用IsCancellationRequested獲取是否已經取消該值進行判斷。

static void Main(string[] args)    {      Console.WriteLine("開始進行計算");      // ThreadPool.QueueUserWorkItem(Sum, 10);      var ctx = new CancellationTokenSource();      var task = new Task<int>(() => Sum(ctx.Token, 100000));      task.Start();      //顯示等待獲取結果      //task.Wait(ctx.Token);      Thread.Sleep(1000);      ctx.Cancel();      //調用Result時,等待返回結果      Console.WriteLine("程序結果為 Sum = {0}", task.Result);      Console.WriteLine("程序結束");      Console.ReadLine();    }    public static int Sum(CancellationToken cts, object i)    {      var sum = 0;          for (var j = 0; j <= (int)i; j++)      {        if (cts.IsCancellationRequested) return sum;        Thread.Sleep(50);        Console.Write("{0} + ", sum);        sum += j;      }      Console.WriteLine(" = {0}", sum);      return sum;    }

任務完成后自動啟動新任務

實際的開發應用中,經常出現一次任務完成后立刻啟動另外一個任務,并且不能夠使線程阻塞,在任務尚未完成時調用result會使程序阻塞,無法查看任務的執行進度,TASK提供了一個方法ContinueWith,它不會阻塞任何線程,當第一個任務完成時,會立即啟動第二個任務。

static void Main(string[] args)    {      Console.WriteLine("開始進行計算");      // ThreadPool.QueueUserWorkItem(Sum, 10);      var ctx = new CancellationTokenSource();      var task = new Task<int>(() => Sum(ctx.Token, 100000));      task.Start();      var cwt = task.ContinueWith(p =>      {        Console.WriteLine("task result ={0} ",task.Result);      });      //顯示等待獲取結果      //task.Wait(ctx.Token);      Thread.Sleep(1000);      ctx.Cancel();      //調用Result時,等待返回結果      Console.WriteLine("程序結果為 Sum = {0}", task.Result);      Console.WriteLine("程序結束");      Console.ReadLine();    }    public static int Sum(CancellationToken cts, object i)    {      var sum = 0;          for (var j = 0; j <= (int)i; j++)      {        if (cts.IsCancellationRequested) return sum;        Thread.Sleep(50);        Console.Write("{0} + ", sum);        sum += j;      }      Console.WriteLine(" = {0}", sum);      return sum;    }

Async&Await 簡單使用

使用Async&Await的主要目的是方便進行異步操作,因為.net 4.0 以前進行異步操作時比較復雜的,主要是通過調用微軟提供的異步回調方法進行編程,如果遇到需要自己實現的方法顯得非常頭疼,.net的各個版本都有自己主推的技術,像.NET1.1中的委托,.NET2.0中的泛型,.NET3.0中的Linq,.NET4.0中的Dynimac,.net4.5主推的就是異步編程,大家只需要了解TASK+異步函數就可以實現異步編程。

async:告訴CLR這是一個異步函數。

await:將Task<TResult>返回值的函數進行異步處理。

示例目的:獲取網址JS代碼,并在界面顯示。

private static async Task<string> DownloadStringWithRetries(string uri)    {      using (var client = new HttpClient())      {        // 第1 次重試前等1 秒,第2 次等2 秒,第3 次等4 秒。        var nextDelay = TimeSpan.FromSeconds(1);        for (int i = 0; i != 3; ++i)        {          try          {            return await client.GetStringAsync(uri);          }          catch          {          }          await Task.Delay(nextDelay);          nextDelay = nextDelay + nextDelay;        }        // 最后重試一次,以便讓調用者知道出錯信息。        return await client.GetStringAsync(uri);      }    }
static void Main(string[] args)    {      Console.WriteLine("獲取百度數據");      ExecuteAsync();      Console.WriteLine("線程結束");      Console.ReadLine();    }    public static async void ExecuteAsync()    {      string text = await DownloadStringWithRetries("http://wwww.baidu.com");      Console.WriteLine(text);    }

運行結果發現,首先獲取百度數據,線程結束,最后顯示HTML代碼,這是因為異步開啟了新的線程,并不會造成線程阻塞。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91黑丝在线观看| 色天天综合狠狠色| 久热精品视频在线| 欧美性猛交xxxx乱大交蜜桃| 欧美日韩免费区域视频在线观看| 日韩欧美在线观看| 亚洲免费一级电影| 久久久视频在线| 国产在线观看精品一区二区三区| 欧美小视频在线| 中文字幕国内精品| 国产成人精品午夜| 国产精品久久久久久久美男| 亚洲成人精品久久| 日本19禁啪啪免费观看www| 欧美日韩亚洲国产一区| 亚洲区免费影片| 欧美日韩激情小视频| 国产一区二区三区在线观看视频| 操日韩av在线电影| 91香蕉亚洲精品| 国产成人精品视频在线观看| 久久久欧美一区二区| 国语对白做受69| 国产亚洲精品美女久久久| 视频在线一区二区| 国产在线日韩在线| 黑人巨大精品欧美一区二区免费| 欧美极品少妇xxxxⅹ免费视频| 精品调教chinesegay| 国产日韩欧美在线视频观看| 97不卡在线视频| 视频在线观看一区二区| 欧美日本亚洲视频| 国产专区精品视频| 亚洲天堂av网| 91精品久久久久| 久久欧美在线电影| 亚洲成成品网站| 狠狠色香婷婷久久亚洲精品| 97精品国产97久久久久久春色| 久久久久99精品久久久久| 国产精品久久二区| 久久久久久久国产精品视频| 欧美性猛交xxxx免费看漫画| 欧美另类精品xxxx孕妇| 欧美日韩福利在线观看| 另类少妇人与禽zozz0性伦| 日韩精品视频中文在线观看| 性欧美办公室18xxxxhd| 亚洲va欧美va国产综合剧情| 亚洲日韩中文字幕| 欧美理论在线观看| 亚洲精品一区久久久久久| 亚洲直播在线一区| 91av中文字幕| 日韩免费中文字幕| 国产精品吹潮在线观看| 91精品国产高清久久久久久久久| 亚洲va欧美va国产综合剧情| 欧美超级乱淫片喷水| 国产精品日日摸夜夜添夜夜av| yw.139尤物在线精品视频| 久久久97精品| 川上优av一区二区线观看| 国产精品最新在线观看| 欧美激情va永久在线播放| 81精品国产乱码久久久久久| 97涩涩爰在线观看亚洲| 国产成人久久精品| 亚洲欧美三级伦理| 亚洲视频综合网| 亚洲欧美在线第一页| 欧美成人三级视频网站| 国产一区在线播放| 日韩经典一区二区三区| 在线午夜精品自拍| 日韩免费av片在线观看| 这里精品视频免费| 久久久999成人| 日本欧美黄网站| 国产99久久精品一区二区 夜夜躁日日躁| 夜夜嗨av色综合久久久综合网| 一区二区在线免费视频| 成人久久久久爱| 国产91精品最新在线播放| 国产亚洲免费的视频看| 久久久av电影| 97香蕉久久超级碰碰高清版| 欧美精品久久久久a| 久久久久久有精品国产| 上原亚衣av一区二区三区| 69精品小视频| 日韩视频亚洲视频| 亚洲人成电影在线| 欧美激情在线观看视频| 国产成人综合精品| 97欧美精品一区二区三区| 另类美女黄大片| 国产欧美在线播放| 91精品国产综合久久香蕉922| 日韩精品电影网| 日韩激情av在线播放| 久久久久久成人| 激情懂色av一区av二区av| 91免费看视频.| 欧美一级大胆视频| 日本久久久久久久久| 久久久久久久色| 日韩av片电影专区| 欧美日韩国产综合视频在线观看中文| 国内外成人免费激情在线视频网站| 色一情一乱一区二区| 欧美日韩成人在线视频| 国产91色在线| 欧美巨乳美女视频| 亚洲大胆美女视频| 国产精品久在线观看| 69**夜色精品国产69乱| 亚洲国模精品私拍| 久久综合色88| 国产亚洲欧美aaaa| 亚洲视频电影图片偷拍一区| 久久香蕉国产线看观看av| 日韩av毛片网| 精品久久国产精品| 欧美在线一区二区视频| 国产精品在线看| 欧美成人性色生活仑片| 亚洲人成电影网站色www| 国产精品电影网| 日韩精品中文字幕有码专区| 亚洲缚视频在线观看| 尤物精品国产第一福利三区| 国产网站欧美日韩免费精品在线观看| 91在线免费网站| 欧美性黄网官网| 亚洲xxxxx电影| 久久福利视频网| 国内揄拍国内精品| 亚洲欧美国产日韩中文字幕| 欧美xxxx做受欧美| 欧美性猛交xxxx偷拍洗澡| 91视频-88av| 欧美日韩中文字幕在线视频| 久久久天堂国产精品女人| 在线色欧美三级视频| 亚洲二区在线播放视频| 国产精品男人爽免费视频1| 日本精品va在线观看| 欧美一区二区大胆人体摄影专业网站| 欧美日韩国产一区二区| 精品国产欧美一区二区五十路| 日韩中文字幕在线视频播放| 91久久久国产精品| 国产成人中文字幕| 精品欧美aⅴ在线网站| 亚洲精品中文字| 久久好看免费视频| 久久夜色撩人精品| 亚洲xxxx做受欧美| 欧美高清第一页| 午夜欧美不卡精品aaaaa| 疯狂欧美牲乱大交777|