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

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

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

服務器之家 - 編程語言 - ASP.NET教程 - .NET中基于事件的異步模式-EAP

.NET中基于事件的異步模式-EAP

2019-10-15 10:42C#技術網 ASP.NET教程

從.NET 4.5開始,支持的三種異步編程模式:基于事件的異步編程設計模式、異步編程模型、基于任務的編程模型,感興趣的朋友可以參考下

前言 
在C# 5.0中,新增了async await 2個關鍵字支持異步編程的操作。在講述這兩個關鍵字之前,我先總結一下.NET中的常見的異步編程模型。 
異步編程一直是比較復雜的問題,其中要處理多線程之間的數據同步、獲取進度、可取消、獲取結果、不影響主線程操作、多個任務之間互相不影響等,因此需要設計編程模型去處理此類問題。 

從.NET 4.5開始,支持的三種異步編程模式: 
基于事件的異步編程設計模式 (EAP,Event-based Asynchronous Pattern) 
異步編程模型(APE,Asynchronous Programming Model) 
基于任務的編程模型(TAP,Task-based Asynchronous Pattern) 
目前新版的.NET是偏向于建議使用TAP方式進行異步編程,WINRT中的異步操作就只有TAP的身影,async await關鍵字也只是支持TAP的編程模型。 

基于事件的異步模式 - EAP 
EAP的編程模式的代碼有以下特點: 
將有一個或多個名為 “[方法名稱]Async” 的方法。這些方法可能會創建同步版本的鏡像,這些同步版本會在當前線程上執行相同的操作。 
該類還可能有一個 “[方法名稱]Completed” 事件,監聽異步方法的結果。 
它可能會有一個 “[方法名稱]AsyncCancel”(或只是 CancelAsync)方法,用于取消正在進行的異步操作。 
下面是一個符合此模式的類聲明示例 

復制代碼代碼如下:


public class AsyncExample 

// Synchronous methods. 
public int Method1(string param); 
public void Method2(double param); 
// Asynchronous methods. 
public void Method1Async(string param); 
public void Method1Async(string param, object userState); 
public event Method1CompletedEventHandler Method1Completed; 
public void Method2Async(double param); 
public void Method2Async(double param, object userState); 
public event Method2CompletedEventHandler Method2Completed; 
public void CancelAsync(object userState); 
public bool IsBusy { get; } 
// Class implementation not shown. 


這里虛構的 AsyncExample 類有兩個方法,都支持同步和異步調用。同步重載的行為類似于方法調用,它們對調用線程執行操作;如果操作很耗時,則調用的返回可能會有明顯的延遲。異步重載將在另一個線程上啟動操作,然后立即返回,允許在調用線程繼續執行的同時讓操作“在后臺”執行。 
System.Net.WebClient 本身就有很多EAP的例子,以它的DownloadString為例,WebClient中跟DownloadString相關的方法有: 
DownloadString:同步下載字符串資源的方法,此方法阻塞當前線程。 
DownloadStringAsync:使用EAP異步編程模式下載字符串資源的方法,此方法不會阻塞當前線程。 
DownloadStringCompleted:響應異步下載時完成的事件。 
DownloadProgressChanged:響應異步下載時進度變化。 
調用模型示例如下: 

復制代碼代碼如下:


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
namespace AsyncTest1.EAP 

public class EAPRunTest1 

public static void AsyncRun() { 
Utility.Log("AsyncRun:start"); 
//測試網址 
string url = "http://sports.163.com/nba/"; 
using (WebClient webClient = new WebClient()) { 
//監控下載進度 
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged); 
//監控完成情況 
webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted); 
webClient.DownloadStringAsync(new Uri(url)); 
Utility.Log("AsyncRun:download_start"); 


static void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 

string log = "AsyncRun:download_completed"; 
log += "|cancel=" + e.Cancelled.ToString() ; 
if (e.Error != null) 

//出現異常,就記錄異常 
log += "|error=" + e.Error.Message; 

else { 
//沒有出現異常,則記錄結果 
log += "|result_size=" + Utility.GetStrLen(e.Result); 

Utility.Log(log); 

static void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 

Utility.Log("AsyncRun:download_progress|percent=" + e.ProgressPercentage.ToString()); 



運行結果: 
2012-12-28 00:39:39:621 AsyncRun:start 
2012-12-28 00:39:40:377 AsyncRun:download_start 
2012-12-28 00:39:40:903 AsyncRun:download_progress|percent=1 
2012-12-28 00:39:40:933 AsyncRun:download_progress|percent=3 
2012-12-28 00:39:40:933 AsyncRun:download_progress|percent=5 
2012-12-28 00:39:40:934 AsyncRun:download_progress|percent=5 
2012-12-28 00:39:40:975 AsyncRun:download_progress|percent=9 
2012-12-28 00:39:41:068 AsyncRun:download_progress|percent=21 
2012-12-28 00:39:41:131 AsyncRun:download_progress|percent=29 
2012-12-28 00:39:41:182 AsyncRun:download_progress|percent=37 
2012-12-28 00:39:41:298 AsyncRun:download_progress|percent=50 
2012-12-28 00:39:41:354 AsyncRun:download_progress|percent=58 
2012-12-28 00:39:41:447 AsyncRun:download_progress|percent=74 
2012-12-28 00:39:41:489 AsyncRun:download_progress|percent=82 
2012-12-28 00:39:41:582 AsyncRun:download_progress|percent=100 
2012-12-28 00:39:41:582 AsyncRun:download_progress|percent=100 
2012-12-28 00:39:41:614 AsyncRun:download_completed|cancel=False|result_size=205568

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草国产在线观看 | 1769在线视频 | 秋霞午夜伦午夜高清福利片 | 精品区2区3区4区产品乱码9 | 免费高清在线视频色yeye | 按摩院已婚妇女中文字幕 | 亚洲精品视频免费在线观看 | 户外露出野战hd | ts人妖另类国产 | 亚洲欧美日韩精品久久亚洲区 | 好姑娘在线视频观看免费 | 日产乱码卡一卡2卡三卡四福利 | 俄罗斯海滩厕所偷窥 | 俄罗斯烧性春三级k8播放 | 亚洲九九爱 | 美女的让男人桶爽免费看 | sss在线观看免费视频 | 午夜小视频免费 | 大陆日韩欧美 | 99久久99久久免费精品蜜桃 | 暗卫调教女主肉高h | 日本肉体xxxx| 女bbbbxxx孕妇 | 大片毛片女女女女女女女 | 荡娃艳妇系列小说 | 成人蜜桃网 | 毛片网站免费观看 | 亚洲天天综合网 | 99热在线观看免费 | 国产成人一区二区三区 | 亚洲国产精品自产在线播放 | 黑帮少爷爱上我第8集最新 荷兰精品女人性hd 和日本免费不卡在线v | 四虎影院在线免费 | 日本中文字幕二区三区 | 9191免费永久观看 | 成人小视频在线观看免费 | 激情亚洲天堂 | 久久精品中文字幕 | 好爽轻点太大了太深了 | 四虎1515hhh co m | 免费毛片大全 |