日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET异步编程之新利器——Task与Await、Async

發布時間:2023/12/10 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET异步编程之新利器——Task与Await、Async 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.??FrameWork 4.0之前的線程世界?   

  ? 在.NET FrameWork 4.0之前,如果我們使用線程。一般有以下幾種方式:

  • 使用System.Threading.Thread 類,調用實例方法Start()開啟一個新線程,調用Abort()方法來提前終止線程。
  • 使用System.Threading.ThreadPool類,調用靜態方法QueueUserWorkItem(),將方法放入線程池隊列,線程池來控制調用。
  • 使用BeginInvoke,EndInvoke,BeginRead,EnRead,BeginWrite,EndWrite等一系列的異步方法。
  • 使用System.ComponentModel.BackgroundWorker控件,調用實例方法RunWorkerAsync(),開啟一個新線程。 

二.??.Net 傳統異步編程概述?

  • 異步編程模型 (APM),在該模型中異步操作由一對 Begin/End 方法(如 FileStream.BeginRead 和 Stream.EndRead)表示。
  • 基于事件的異步模式 (EAP),在該模式中異步操作由名為“操作名稱Async”和“操作名稱Completed”的方法/事件對(例如 WebClient.DownloadStringAsync 和 WebClient.DownloadStringCompleted)表示。 (EAP 是在 .NET Framework 2.0 版中引入的,在silverlight或者wpf變成中經常用到)。

三.??Task 的優點以及功能???

  • 在任務啟動后,可以隨時以任務延續的形式注冊回調。
  • 通過使用 ContinueWhenAll 和 ContinueWhenAny 方法或者 WaitAll 方法或 WaitAny 方法,協調多個為了響應 Begin_ 方法而執行的操作。
  • 在同一 Task 對象中封裝異步 I/O 綁定和計算綁定操作。
  • 監視 Task 對象的狀態。
  • 使用 TaskCompletionSource 將操作的狀態封送到 Task 對象。

四.??TASK的用法

?????請參考這篇文章

五.??使用 Task 封裝常見的異步編程模式

  • 使用Task封裝APM異步編程模式。C#5.0中提供的async和await使異步編程更簡單。await在msdn的解釋是“運算符應用于一個異步方法的任務掛起方法的執行,直到等待任務完成。?任務表示正在進行的工作。”它返回的結果是Task和Task<TResult>.下面我們就用一個demo具體解析:

?
  • private async void Init()
  • {
  • //部分代碼省略
  • var orgs = await _serviceClient.GetAllOrganizationTaskAsync();
  • }
  • ?
  • //通過WCF調用,采取分布類,名稱一樣。
  • public partial class ServiceClient
  • {
  • public Task<ObservableCollection<Organization>> GetAllOrganizationTaskAsync()
  • {
  • //Task 封裝APM
  • return Task<ObservableCollection<Organization>>.Factory.FromAsync(this.Channel.BeginGetAllOrganization, this.Channel.EndGetAllOrganization, null);
  • }
  • }
    • 使用 Task 對象封裝 EPM 異步模式?。?這種模式從 .Net 2.0 開始出現, 同時在 Silverlight 中大量出現, 這種異步模式以 “操作名稱Async” 函數和 “操作名稱Completed” 事件成對出現為特征。常見的操作有使用lamda表達式;或者使用+=“操作名稱Completed”(tip:如果使用lamda表達式,無法回收資源,如果同時調用多個,數據會亂套,建議如果非要用,最好用+=“操作名稱Completed”,在操作名稱Completed事件中再-=“操作名稱Completed”)。
      關鍵字:TaskCompletionSource,簡單理解委托給task屬性,利用task來操作。

    ?
  • var source = new TaskCompletionSource<string>();
  • ?
  • var webClient = new WebClient();
  • ?
  • webClient.DownloadStringCompleted += (sender, args) => {
  • ?
  • if (args.Cancelled) {
  • ?
  • source.SetCanceled();
  • ?
  • return;
  • ?
  • }
  • ?
  • if (args.Error != null) {
  • ?
  • source.SetException(args.Error);
  • ?
  • return;
  • ?
  • }
  • ?
  • source.SetResult(args.Result);
  • ?
  • };
  • ?
  • webClient.DownloadStringAsync(new Uri(UrlToTest, UriKind.Absolute), null);
  • ?
  • source.Task.Wait();
  • ?
  • var result = source.Task.Result;
  • 此博客來自于http://www.cnblogs.com/luqixinhe/archive/2013/07/18/3197645.html,記錄時為了更好的學習。

    總結

    以上是生活随笔為你收集整理的.NET异步编程之新利器——Task与Await、Async的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。