最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET中的異步編程-EAP/APM使用方法及案例介紹

 更新時(shí)間:2013年01月15日 15:00:43   作者:  
從.NET 4.5開(kāi)始,支持的三種異步編程模式:基于事件的異步編程設(shè)計(jì)模式;異步編程模型;基于任務(wù)的編程模型接下來(lái)先總結(jié)一下舊有的2種模式:EAP、APM,感興趣的朋友可以了解下
從.NET 4.5開(kāi)始,支持的三種異步編程模式
•基于事件的異步編程設(shè)計(jì)模式 (EAP,Event-based Asynchronous Pattern)
•異步編程模型(APM,Asynchronous Programming Model)
•基于任務(wù)的編程模型(TAP,Task-based Asynchronous Pattern)
基于任務(wù)的異步模式 (TAP) 是基于 System.Threading.Tasks 命名空間的 Task 和 Task<TResult>,用于表示任意異步操作。 TAP 是新開(kāi)發(fā)的建議異步設(shè)計(jì)模式,之后再討論。

先總結(jié)一下舊有的2種模式:EAP、APM

從以下幾個(gè)方面,看這2種異步編程方式的異同:
•命名、參數(shù)、返回值
•典型應(yīng)用
•捕獲異常
•狀態(tài)
•取消操作
•進(jìn)度報(bào)告

EAP
命名、參數(shù)、返回值
EAP的編程模式的代碼命名有以下特點(diǎn):
•將有一個(gè)或多個(gè)名為 “[方法名稱(chēng)]Async” 的方法。這些方法可能會(huì)創(chuàng)建同步版本的鏡像,這些同步版本會(huì)在當(dāng)前線(xiàn)程上執(zhí)行相同的操作。
•該類(lèi)還可能有一個(gè) “[方法名稱(chēng)]Completed” 事件,監(jiān)聽(tīng)異步方法的結(jié)果。
•它可能會(huì)有一個(gè) “[方法名稱(chēng)]AsyncCancel”(或只是 CancelAsync)方法,用于取消正在進(jìn)行的異步操作。
參數(shù)和返回值都沒(méi)有特殊規(guī)定,按照業(yè)務(wù)需求而定

典型應(yīng)用
以請(qǐng)求一個(gè)Url為例
復(fù)制代碼 代碼如下:

public class EAP_Typical
{
public static void AsyncRun()
{
Utility.Log("AsyncRun:start");
//測(cè)試網(wǎng)址
string url = http://sports.163.com/nba/;
using (WebClient webClient = new WebClient())
{
//獲取完成情況
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";
//獲取返回結(jié)果
log += "|result_size=" + Utility.GetStrLen(e.Result);
Utility.Log(log);
}
}

捕獲異常
異常信息一般在Completed的事件參數(shù)中傳遞的。緊接上面的例子,如果需要獲取返回的異常信息,則需要改寫(xiě)一下DownloadStringComleted的方法。
復(fù)制代碼 代碼如下:

static void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
string log = "AsyncRun:download_completed";
if (e.Error != null) //可見(jiàn),在事件的參數(shù)傳輸異常信息
{
//出現(xiàn)異常,就記錄異常
log += "|error=" + e.Error.Message;
}
else
{
//沒(méi)有出現(xiàn)異常,則記錄結(jié)果
log += "|result_size=" + Utility.GetStrLen(e.Result);
}
Utility.Log(log);
}

狀態(tài)
EAP本身并沒(méi)有維護(hù)狀態(tài),如果需要的話(huà),應(yīng)該設(shè)置不同的時(shí)間響應(yīng)不同的狀態(tài)改變;
假設(shè)剛才的DownloadStringAsync,需要增加多幾個(gè)狀態(tài)值,可以考慮增加多幾個(gè)事件。

Event DownloadStringStarted(響應(yīng)下載剛開(kāi)始)
Event DownloadStringPending(響應(yīng)下載阻塞中)
Event DownloadStringCancel(響應(yīng)下載取消時(shí))
等等。

取消操作
按命名規(guī)范,如果操作對(duì)應(yīng)有“[方法名稱(chēng)]AsyncCancel”(或只是 CancelAsync)方法,則支持取消操作。
取消的狀態(tài)捕獲,還是以剛才的下載Url輸出html為例,還是在DownloadStringCompleted 獲取取消與否的狀態(tài)。DownloadStringCompletedEventArgs. Cancelled
注意的是,如果用戶(hù)執(zhí)行了CancelAsync后,在DownloadStringCompletedEventArgs.Error就會(huì)獲取到對(duì)應(yīng)的異常,此時(shí)不要再取DownloadStringCompletedEventArgs.Result。

進(jìn)度報(bào)告
EAP沒(méi)有硬性規(guī)定說(shuō)要支持進(jìn)度報(bào)告,但可以很順其自然地通過(guò)時(shí)間響應(yīng)進(jìn)度變化。
以當(dāng)前例子,WebClient 就提供了DownloadProgressChanged 做進(jìn)度變化的響應(yīng)事件。

APM
命名、參數(shù)、返回值
APM的編程模式的代碼命名有以下特點(diǎn):
•使用 IAsyncResult 設(shè)計(jì)模式的異步操作是通過(guò)名為[Begin操作名稱(chēng)] 和 [End操作名稱(chēng)] 的兩個(gè)方法來(lái)實(shí)現(xiàn)的,這兩個(gè)方法分別開(kāi)始和結(jié)束異步操作 操作名稱(chēng)。 例如,F(xiàn)ileStream 類(lèi)提供 BeginRead 和 EndRead 方法來(lái)從文件異步讀取字節(jié)。 這兩個(gè)方法實(shí)現(xiàn)了 Read 方法的異步版本。
•在調(diào)用 [Begin操作名稱(chēng)] 后,應(yīng)用程序可以繼續(xù)在調(diào)用線(xiàn)程上執(zhí)行指令,同時(shí)異步操作在另一個(gè)線(xiàn)程上執(zhí)行。 每次調(diào)用 [Begin操作名稱(chēng)] 時(shí),應(yīng)用程序還應(yīng)調(diào)用 [End操作名稱(chēng)] 來(lái)獲取操作的結(jié)果。

典型應(yīng)用
以請(qǐng)求一個(gè)Url為例
復(fù)制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace AsyncTest1.APM
{
public class APMTestRun1
{
public static void AsyncRun()
{
Utility.Log("APMAsyncRun:start");
//測(cè)試網(wǎng)址
string url = "http://sports.163.com/nba/";
HttpWebRequest webRequest = HttpWebRequest.Create(url) as HttpWebRequest;
webRequest.BeginGetResponse(Callback, webRequest);
Utility.Log("AsyncRun:download_start");
}
private static void Callback(IAsyncResult ar)
{
var source = ar.AsyncState as HttpWebRequest;
var response = source.EndGetResponse(ar);
using (var stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
string content = reader.ReadToEnd();
Utility.Log("AsyncRun:result_size=" + Utility.GetStrLen(content));
}
}
}
}
}

委托的異步調(diào)用也用的是APM模式,這個(gè)方式的強(qiáng)大之處,在于可以使任何方法編程異步調(diào)用。
復(fù)制代碼 代碼如下:

/// <summary>
/// 一個(gè)耗時(shí)的方法
/// </summary>
private static void CaluateManyNumber() {
for (int i = 0; i < 10; i++)
{
Thread.Sleep(100);
Console.WriteLine("loop==>"+i.ToString());
}
}
/// <summary>
/// 委托,讓耗時(shí)方法可以異步執(zhí)行
/// </summary>
public static void AsyncDelegate() {
//委托簡(jiǎn)單的包裝了一下方法
Action action = CaluateManyNumber;
action.BeginInvoke(DelegateCallback, null);
Console.WriteLine("action begin");
}
/// <summary>
/// 異步回調(diào)
/// </summary>
/// <param name="ar"></param>
private static void DelegateCallback(IAsyncResult ar) {
AsyncResult asyncResult = ar as AsyncResult;
var delegateSource = asyncResult.AsyncDelegate as Action;
delegateSource.EndInvoke(ar);
Console.WriteLine("action end");
}

捕獲異常
異常信息要在[End操作名稱(chēng)]中獲取。
復(fù)制代碼 代碼如下:

private static void Callback(IAsyncResult ar)
{
var source = ar.AsyncState as HttpWebRequest;
WebResponse response = null;
try
{
response = source.EndGetResponse(ar);
}
catch (Exception ex) {
Utility.Log("error:" + ex.Message);
response = null;
}
if (response != null)
{
using (var stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
string content = reader.ReadToEnd();
Utility.Log("AsyncRun:result_size=" + Utility.GetStrLen(content));
}
}
}
}

狀態(tài)和取消操作、進(jìn)度報(bào)告
APM模式本身不支持狀態(tài)多樣化和取消操作、進(jìn)度報(bào)告。

相關(guān)文章

  • asp.net 特定目錄form驗(yàn)證

    asp.net 特定目錄form驗(yàn)證

    前幾聽(tīng)我的一個(gè)同事說(shuō)form驗(yàn)證,我也只是聽(tīng)說(shuō)過(guò),說(shuō)是一個(gè)很簡(jiǎn)單的驗(yàn)證,最近也在做一個(gè)小型的企業(yè)網(wǎng)站(因?yàn)閯傔M(jìn)公司不久,老板就給了單獨(dú)一個(gè)小項(xiàng)目練練手)。
    2009-06-06
  • ASP.NET Page函數(shù)調(diào)用順序解析

    ASP.NET Page函數(shù)調(diào)用順序解析

    asp.net頁(yè)面事件執(zhí)行順序,需要的朋友可以參考下。
    2010-06-06
  • asp.net Gridview里添加匯總行

    asp.net Gridview里添加匯總行

    在rowdatabound事件里添加同時(shí)showfooter設(shè)為true
    2008-11-11
  • ASP.NET Core中自定義路由約束的實(shí)現(xiàn)

    ASP.NET Core中自定義路由約束的實(shí)現(xiàn)

    這篇文章主要介紹了ASP.NET Core中自定義路由約束的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • AspNet Core上實(shí)現(xiàn)web定時(shí)任務(wù)實(shí)例

    AspNet Core上實(shí)現(xiàn)web定時(shí)任務(wù)實(shí)例

    在本篇文章里小編給大家分享了關(guān)于AspNet Core上實(shí)現(xiàn)web定時(shí)任務(wù)的實(shí)例內(nèi)容,有興趣的朋友們學(xué)習(xí)參考下。
    2019-02-02
  • 解決asp.net mvc UpdateModel更新對(duì)象后出現(xiàn)null問(wèn)題的方法

    解決asp.net mvc UpdateModel更新對(duì)象后出現(xiàn)null問(wèn)題的方法

    這篇文章主要介紹了解決asp.net mvc UpdateModel 更新對(duì)象后出現(xiàn)null問(wèn)題的方法,需要的朋友可以參考下
    2015-11-11
  • WPF實(shí)現(xiàn)左右移動(dòng)(晃動(dòng))動(dòng)畫(huà)效果

    WPF實(shí)現(xiàn)左右移動(dòng)(晃動(dòng))動(dòng)畫(huà)效果

    這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)左右移動(dòng)或晃動(dòng)動(dòng)畫(huà)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Ubuntu16.04系統(tǒng)配置.net core環(huán)境

    Ubuntu16.04系統(tǒng)配置.net core環(huán)境

    本文給大家介紹的是在Ubuntu16.04系統(tǒng)配置.net core環(huán)境的方法,由于作者本身用的是WIN系統(tǒng),所以這次教程是在VMware中進(jìn)行的,希望大家能夠喜歡。
    2016-07-07
  • webapi跨域使用session的方法示例

    webapi跨域使用session的方法示例

    這篇文章主要介紹了webapi跨域使用session的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 淺談ASP.NET中多層架構(gòu)

    淺談ASP.NET中多層架構(gòu)

    Asp.net的多層架構(gòu)主要是為了解決數(shù)據(jù)層,邏輯層,表示層等之間的關(guān)系。我的做法是這樣的:首先建立一個(gè)DataCore的基類(lèi)?;?lèi)里面封裝了一些低層的數(shù)據(jù)庫(kù)的基本操作,比如說(shuō)數(shù)據(jù)庫(kù)聯(lián)接,調(diào)用存儲(chǔ)過(guò)程等等。
    2015-06-06

最新評(píng)論

九江市| 西藏| 广饶县| 蕲春县| 都江堰市| 江阴市| 沁源县| 东乡| 常熟市| 大荔县| 桃园市| 浦城县| 南充市| 连山| 青浦区| 堆龙德庆县| 拉萨市| 体育| 景东| 台东市| 大理市| 新宁县| 永定县| 苏尼特右旗| 兰溪市| 大同县| 海南省| 清河县| 赞皇县| 鹤壁市| 龙井市| 资兴市| 阳西县| 密山市| 健康| 常德市| 木里| 运城市| 虹口区| 武强县| 奇台县|