变态重口极致另类在线-波多久久夜色精品国产-波多野结衣在线观看一区-波多野结衣在线观看一区二区-污污的网站免费阅读-污污视频网址

當前位置:首頁文章首頁 新聞中心

使用 Task 簡化異步編程

作者:  來源:  發布時間:2012-1-16 10:12:06  點擊:

.Net 傳統異步編程概述

.NET Framework 提供以下兩種執行 I/O 綁定和計算綁定異步操作的標準模式:

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

Task 的優點以及功能

通過使用 Task 對象,可以簡化代碼并利用以下有用的功能:

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

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

1、 使用 Task 對象封裝 APM 異步模式, 這種異步模式是 .Net 標準的異步模式之一, 也是 .Net 最古老的異步模式, 自 .Net 1.0 起就開始出現了,通常由一對 Begin/End 方法同時出現, 以 WebRequest 的 BeginGetResponse 與 EndGetResponse 方法為例:

var request = WebRequest.CreateHttp(UrlToTest); request.Method = "GET"; var requestTask = Task.Factory.FromAsync<WebResponse>(    request.BeginGetResponse,    request.EndGetResponse,    null ); requestTask.Wait(); var response = requestTask.Result; 

2、使用 Task 對象封裝 EPM 異步模式, 這種模式從 .Net 2.0 開始出現, 同時在 Silverlight 中大量出現, 這種異步模式以 “操作名稱Async” 函數和 “操作名稱Completed” 事件成對出現為特征, 以 WebClient 的 DownloadStringAsync 方法與 DownLoadStringCompleted 事件為例:

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;

3、 使用 Task 對象封裝其它非標準異步模式, 這種模式大量出現在第三方類庫中, 通常通過一個 Action 參數進行回調, 以下面的方法為例:

void AddAsync(int a, int b, Action<int> callback)

封裝方法與封裝 EPM 異步模式類似:

var source = new TaskCompletionSource<int>(); Action<int> callback = i => source.SetResult(i); AddAsync(1, 2, callback); source.Task.Wait(); var result = source.Task.Result; 

通過上面的例子可以看出, 用 Task 對象對異步操作進行封裝之后, 異步操作簡化了很多, 只要調用 Task 的 Wait 方法, 可以直接獲取異步操作的結果, 而不用轉到回調函數中進行處理, 接下來看一個比較實際的例子。

緩沖查詢示例

以 Esri 提供的緩沖查詢為例, 用戶現在地圖上選擇一個合適的點, 按照一定半徑查詢查詢緩沖區, 再查詢這個緩沖區內相關的建筑物信息, 這個例子中, 我們需要與服務端進行兩次交互:

  1. 根據用戶選擇的點查詢出緩沖區;
  2. 查詢緩沖區內的建筑物信息;

這個例子在 GIS 查詢中可以說是非常簡單的, 也是很典型的, ESRI 的例子中也給出了完整的源代碼, 這個例子的核心邏輯代碼是:

_geometryService = new GeometryService(GeoServerUrl); _geometryService.BufferCompleted += GeometryService_BufferCompleted;  _queryTask = new QueryTask(QueryTaskUrl); _queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;  void MyMap_MouseClick(object sender, Map.MouseEventArgs e) {    // 部分代碼省略, 開始緩沖查詢    _geometryService.BufferAsync(bufferParams);  }  void GeometryService_BufferCompleted(object sender, GraphicsEventArgs args) {    // 部分代碼省略, 獲取緩沖查詢結果, 開始查詢緩沖區內的建筑物信息    _queryTask.ExecuteAsync(query); }  void QueryTask_ExecuteCompleted(object sender, QueryEventArgs args) {    // 將查詢結果更新到界面上 } 

這只是一個 GIS 開發中很簡單的一個查詢, 上面的代碼卻將邏輯分散在三個函數中, 在實際應用中, 與服務端的交互次數會更多, 代碼的邏輯會分散在更多的函數中, 導致代碼的可讀性以及可維護性降低。 如果使用 Task 對象對這些任務進行封裝, 那么整個邏輯將會簡潔很多, GeometryService 和 QueryTask 提供的是 EPM 異步模式, 相應的封裝方法如上所示, 最后, 用 Task 封裝異步操作之后的代碼如下:

void MyMap_MouseClick(object sender, Map.MouseEventArgs e) {    Task.Factory.StartNew(() => {       // 省略部分 UI 代碼, 開始緩沖查詢       var bufferParams = new BufferParameters() { /* 初始化緩沖查詢參數 */};       var bufferTask = _geometryService.CreateBufferTask()       // 等待緩沖查詢結果       bufferTask.Wait();       // 省略更新 UI 的代碼, 開始查詢緩沖區內的建筑物信息       var query = new Query() { /* 初始化查詢參數 */ };       var queryExecTask = _queryTask.CreateExecTask(query);       queryExecTask.Wait();       // 將查詢結果顯示在界面上, 代碼省略    }); } 

從上面的代碼可以看出, 使用 Task 對象可以把原本分散在三個函數中的邏輯集中在一個函數中即可完成, 代碼的可讀性、可維護性比原來增加了很多。

Task 能完成的任務遠不止這些,比如并行計算、 協調多個并發任務等, 有興趣的可以進一步閱讀相關的 MSDN 資料

相關軟件

相關文章

文章評論

軟件按字母排列: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
主站蜘蛛池模板: 国产一区日韩二区欧美三区 | 久热久操 | 免费看h网站 | 中文字幕一区二区三区乱码aⅴ | 成人深夜福利在线播放不卡 | 黄 片影 院 | 黄色一级网 | 曰批免费动漫视频播放免费 | 深夜免费网站 | 成人a级高清视频在线观看 成人a大片在线观看 | 欧美国产小视频 | 欧美一级视频在线 | 欧美视频免费一区二区三区 | 国产精品二区三区免费播放心 | 粉嫩在线视频 | 成年性午夜免费视频网站不卡 | 成人精品免费网站 | 日韩精品免费一区二区 | 欧美深夜福利网站在线观看 | 成人a毛片在线看免费全部播放 | 91成人软件 | 一本色道久久综合狠狠躁 | 一级aa 毛片高清免费看 | 午夜影院免费体验区 | 国产精品久久久久久夜夜夜夜 | 欧美福利片在线观看 | 精品亚洲欧美高清不卡高清 | 国产日韩欧美亚洲综合在线 | sss亚洲| 亚洲午夜精品在线 | free性欧美人另类 | 日本人甡交全过程 | 日日摸夜夜摸人人嗷嗷叫 | 一级特黄a大片免费 | 午夜国产福利 | 福利片 在线 | 成年人在线看片 | 欧美亚洲国产片在线观看 | 久久伊人网站 | 国产三级日本三级美三级 | 久久综合九九 |