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

ASP.NET2.0中數(shù)據(jù)源控件之異步數(shù)據(jù)訪問

 更新時(shí)間:2006年09月28日 00:00:00   作者:  
  在第 1 部分第 2 部分中,建立了 WeatherDataSource 控件,該控件針對(duì) weather.com(英文)所提供的 XML API 來運(yùn)行,使用 WebRequest 和 WebResponse 來通過 HTTP 訪問數(shù)據(jù)。迄今為止,均是同步訪問該服務(wù)。因此,頁(yè)面處理被阻止,直到 Web 請(qǐng)求完成為止。此方法對(duì)于測(cè)試頁(yè)面是有效的,在小站點(diǎn)上也可能有效,但是在接收大量通信流量的站點(diǎn)上則會(huì)慘??;例如門戶頁(yè)面,天氣模塊在其中可能非常常見。

  引言

  在線程池中有固定不變的大量線程可用于服務(wù)請(qǐng)求,遺憾的是,該解決方案并非僅僅提高限制(還會(huì)增加線程占用資源以及 CPU 占用資源)。因此,當(dāng)一個(gè)頁(yè)面被阻止而等候另一個(gè)服務(wù)器時(shí),它還在占用線程,因而可能會(huì)導(dǎo)致其他傳入的請(qǐng)求在隊(duì)列中等候更長(zhǎng)的時(shí)間。這將導(dǎo)致對(duì)站點(diǎn)的訪問變慢,并降低 CPU 的利用率。在 Visual Studio 2005 中,我們引入了異步頁(yè)面,這使得控件能夠定義它們希望異步完成的任務(wù),即,無(wú)需阻止用來處理請(qǐng)求的線程。在此將不介紹異步頁(yè)面本身的詳細(xì)信息,Dmitry(英文)和 Fritz Onion(英文)中以前已經(jīng)有所介紹。此處要介紹的是如何在數(shù)據(jù)源控件中利用此功能,使用加載項(xiàng)框架來實(shí)現(xiàn)異步數(shù)據(jù)源。

  背景

  在第 1 部分中,間接提到了 DataSourceView 類的有些古怪的設(shè)計(jì):

public abstract class DataSourceView {
 public virtual void Select(DataSourceSelectArguments arguments,
  DataSourceViewSelectCallback callback);
 protected abstract IEnumerable ExecuteSelect(
  DataSourceSelectArguments arguments);
 ...
}

  您會(huì)注意到,公共 Select 方法實(shí)際上并不返回任何數(shù)據(jù)。而是接受一個(gè)回?fù)埽⑼ㄟ^該回?fù)軄矸祷財(cái)?shù)據(jù)。它只調(diào)用受保護(hù)的 ExecuteSelect(它始終執(zhí)行同步數(shù)據(jù)訪問)來檢索要退還給數(shù)據(jù)綁定控件的數(shù)據(jù)。DataSourceView 類的默認(rèn)實(shí)現(xiàn)實(shí)際上不會(huì)異步執(zhí)行任何操作。原因在于,并不存在任何現(xiàn)成的異步數(shù)據(jù)源控件。但 OM 的設(shè)計(jì)確實(shí)允許實(shí)現(xiàn)異步數(shù)據(jù)訪問,在這種設(shè)計(jì)下,數(shù)據(jù)在異步工作完成之后才可用。因此,我們就有了一個(gè)基于回?fù)艿哪P汀?br>
  那些熟悉框架中的異步 API 的人會(huì)注意到缺少了異步模式:公共 Select、BeginSelect 和 EndSelect 方法,在這些方法中,數(shù)據(jù)綁定控件選擇要調(diào)用哪些方法。但是,數(shù)據(jù)綁定控件并不能確定是選擇同步 API 還是選擇異步 API。此外,在數(shù)據(jù)綁定控件上添加屬性也毫無(wú)作用。數(shù)據(jù)源控件封裝了有關(guān)如何訪問數(shù)據(jù)存儲(chǔ)的詳細(xì)信息,對(duì)數(shù)據(jù)存儲(chǔ)的訪問是同步發(fā)生還是異步發(fā)生應(yīng)該根據(jù)數(shù)據(jù)源是否基于語(yǔ)義來決定或者根據(jù)自定義屬性來決定。潛在的“bool PerformAsyncDataAccess”屬性的正確位置適合于數(shù)據(jù)源控件本身。這還使得數(shù)據(jù)源控件可以使用一種方法來執(zhí)行數(shù)據(jù)訪問,即使多個(gè)數(shù)據(jù)綁定控件被綁定到同一個(gè)數(shù)據(jù)源。至此已多次解釋了該體系結(jié)構(gòu)所蘊(yùn)涵的這些微妙的概念,但愿能闡明該設(shè)計(jì)。

  關(guān)于異步任務(wù),最后要注意的一點(diǎn)是:頁(yè)面是否應(yīng)該執(zhí)行任何異步工作完全由頁(yè)面開發(fā)人員最終決定(通過 Page 指令的 Async 屬性)。因此,任何編寫良好的數(shù)據(jù)源控件必須退化為根據(jù)需要來執(zhí)行同步數(shù)據(jù)訪問。

  框架

  在此框架中(在此系列結(jié)尾會(huì)用示例的剩余部分來演示這一點(diǎn)),已將 AsyncDataSource 和 AsyncDataSourceView 基類放在一起,這些基類可以用于實(shí)現(xiàn)能夠執(zhí)行異步數(shù)據(jù)訪問的數(shù)據(jù)源控件。以下大概介紹了框架內(nèi)容,以及有助于弄清楚其含義的一些注釋:

public abstract class AsyncDataSourceControl : DataSourceControl,
IAsyncDataSource {
private bool _performAsyncDataAccess;

protected AsyncDataSourceControl() {
 _performAsyncDataAccess = true;
}

public virtual bool PerformAsyncDataAccess {
 get; set;
}

bool IAsyncDataSource.IsAsync {
 get { return _performAsyncDataAccess && Page.IsAsync; }
}
}

public abstract class AsyncDataSourceView : DataSourceView {

 protected abstract IAsyncResult BeginExecuteSelect(
  DataSourceSelectArguments arguments,
  AsyncCallback asyncCallback,
  object asyncState);

 protected abstract IEnumerable EndExecuteSelect(
  IAsyncResult asyncResult);

  protected override IEnumerable ExecuteSelect(
   DataSourceSelectArguments arguments) {
    //實(shí)現(xiàn)從 DataSourceView 中繼承的
    //抽象 ExecuteSelect 方法,
    //方法是使用 BeginExecuteSelect 和 EndExecuteSelect,
    //以便通過阻止來
    //進(jìn)行同步數(shù)據(jù)訪問。
   }

   private IAsyncResult OnBeginSelect(object sender,
     EventArgs e, AsyncCallback asyncCallback,
     object extraData);
   private void OnEndSelect(IAsyncResult asyncResult);

   public override void Select(DataSourceSelectArguments arguments,
    DataSourceViewSelectCallback callback) {
     if (_owner.IsAsync) {
      //使用 OnBeginSelect 和 OnEndSelect
      //作為 BeginEventHandler 和 EndEventHandler 方法,
      //來調(diào)用 Page.RegisterAsyncTask,
      //以指明需要
      //進(jìn)行異步工作。這些方法將依次
      //調(diào)用特定的
      //數(shù)據(jù)源實(shí)現(xiàn),方法是調(diào)用
      //已在此類中引入的
      //抽象 BeginExecuteSelect 和 EndExecuteSelect
      //方法。
     }
     else {
      //執(zhí)行同步數(shù)據(jù)訪問
      base.Select(arguments, callback);
     }
    }
   ...
}

  示例

  現(xiàn)在,新的 AsyncWeatherDataSource 將從 AsyncDataSourceControl 中派生,而 AsyncWeatherDataSourceView 將從 AsyncDataSourceView 中派生。

public class AsyncWeatherDataSource : AsyncDataSourceControl {

//與 WeatherDataSource 相同
}

private sealed class AsyncWeatherDataSourceView : AsyncDataSourceView {
private AsyncWeatherDataSource _owner;
private WeatherService _weatherService;

public AsyncWeatherDataSourceView(AsyncWeatherDataSource owner,
string viewName)
: base(owner, viewName) {
_owner = owner;
}

protected override IAsyncResult BeginExecuteSelect(DataSourceSelectArguments arguments,
AsyncCallback asyncCallback,
object asyncState) {
arguments.RaiseUnsupportedCapabilitiesError(this);

string zipCode = _owner.GetSelectedZipCode();
if (zipCode.Length == 0) {
return new SynchronousAsyncSelectResult(/* selectResult */
null,
asyncCallback, asyncState);
}

_weatherService = new WeatherService(zipCode);
return _weatherService.BeginGetWeather(asyncCallback, asyncState);
}

protected override IEnumerable EndExecuteSelect(IAsyncResult asyncResult) {
SynchronousAsyncSelectResult syncResult =
asyncResult as SynchronousAsyncSelectResult;
if (syncResult != null) {
return syncResult.SelectResult;
}
else {
Weather weatherObject =
_weatherService.EndGetWeather(asyncResult);
_weatherService = null;

if (weatherObject != null) {
return new Weather[] { weatherObject };
}
}

return null;
}
}

  要注意的關(guān)鍵問題是,在使用該框架時(shí),只需要實(shí)現(xiàn) BeginExecuteSelect 和 EndExecuteSelect。在它們的實(shí)現(xiàn)過程中,通常要調(diào)用由該框架中的各種對(duì)象(例如 WebRequest 或 IO 流)所揭示的 BeginXXX 和 EndXXX 方法(在 Visual Studio 2005 中,還需要調(diào)用 SqlDataCommand),并返回 IAsyncResult。在此示例中,有一個(gè)封裝了基礎(chǔ) WebRequest 對(duì)象的 WeatherService 幫助程序類。

  對(duì)于那些實(shí)際缺少異步模式的框架,您在此會(huì)看到有效的異步模式;以及您要實(shí)現(xiàn)的 BeginExecuteSelect 和 EndExecuteSelect,和您要調(diào)用以返回 IAsyncResult 實(shí)例的 Begin 和 End 方法。

  最有趣的可能是 SynchronousAsyncSelectResult 類(在某種程度上而言是一種矛盾)。此類是框架附帶的。它基本上是一個(gè) IAsyncResult 實(shí)現(xiàn),可使數(shù)據(jù)立即可用,并從其 IAsyncResult.CompletedSynchronously 屬性報(bào)告 true。到目前為止,這僅適用于未選擇郵政編碼的情況,并且需要返回 null(啟動(dòng)異步任務(wù)而只返回 null 是沒有意義的),但正如您會(huì)在下文中看到的,這在其他方案中也是有用的。

  頁(yè)面基礎(chǔ)結(jié)構(gòu)隱藏了在 Microsoft ASP.NET 上下文中執(zhí)行異步工作的大部分詳細(xì)信息。希望在此提供的框架使您執(zhí)行最少的操作就能編寫使用此基礎(chǔ)結(jié)構(gòu)的數(shù)據(jù)源。不過,就其本質(zhì)而言,實(shí)現(xiàn)異步行為是復(fù)雜的。有時(shí)候,第一次閱讀本文時(shí)會(huì)有一些疑問,而第二次閱讀時(shí)可能就明白了。您可以使用下面“我的評(píng)論”表單來發(fā)送問題或進(jìn)行討論。

相關(guān)文章

  • 解決 ASP.NET中目錄訪問權(quán)限的問題

    解決 ASP.NET中目錄訪問權(quán)限的問題

    解決 ASP.NET中目錄訪問權(quán)限的問題...
    2006-09-09
  • Live Write 的代碼高亮插件 Paste Code

    Live Write 的代碼高亮插件 Paste Code

    這些天,開始使用Live Write寫博客了,有時(shí)候貼代碼時(shí),感覺很不爽。用了很多代碼高亮的工具,大多只支持少數(shù)的幾種語(yǔ)言。
    2011-04-04
  • ASP.NET MVC的四種驗(yàn)證編程方式

    ASP.NET MVC的四種驗(yàn)證編程方式

    ASP.NET MVC采用Model綁定為目標(biāo)Action生成了相應(yīng)的參數(shù)列表,但是在真正執(zhí)行目標(biāo)Action方法之前,還需要對(duì)綁定的參數(shù)實(shí)施驗(yàn)證以確保其有效性,我們將針對(duì)參數(shù)的驗(yàn)證成為Model綁定,需要的朋友可以參考下
    2015-10-10
  • VC用Ado接口連接和使用數(shù)據(jù)庫(kù)及注意事項(xiàng)

    VC用Ado接口連接和使用數(shù)據(jù)庫(kù)及注意事項(xiàng)

    進(jìn)行方法調(diào)用時(shí),所傳遞的參數(shù)的類型的轉(zhuǎn)換(可能存在比本文更簡(jiǎn)便的處理方法但我未發(fā)現(xiàn)) ,需要了解的朋友可以參考下
    2012-12-12
  • .NET Windbg分析某婦產(chǎn)醫(yī)院WPF內(nèi)存溢出

    .NET Windbg分析某婦產(chǎn)醫(yī)院WPF內(nèi)存溢出

    這篇文章主要為大家介紹了.NET  Windbg分析某婦產(chǎn)醫(yī)院WPF內(nèi)存溢出,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • asp.net url 偽靜態(tài)設(shè)置方法

    asp.net url 偽靜態(tài)設(shè)置方法

    URL靜態(tài)化需要單獨(dú)對(duì)IIS進(jìn)行配置,步驟如下
    2009-06-06
  • ASP.NET使用Global.asax的方法

    ASP.NET使用Global.asax的方法

    Global.asax是ASP.NET Web應(yīng)用程序的全局文件,它包含了應(yīng)用程序級(jí)別的事件處理程序,允許開發(fā)人員在應(yīng)用程序的生命周期中執(zhí)行特定的邏輯,本文介紹了如何使用Global.asax文件來增強(qiáng)ASP.NET Web應(yīng)用程序的功能,感興趣的朋友一起看看吧
    2024-03-03
  • ASP.NET中的跳轉(zhuǎn) 200, 301, 302轉(zhuǎn)向?qū)崿F(xiàn)代碼

    ASP.NET中的跳轉(zhuǎn) 200, 301, 302轉(zhuǎn)向?qū)崿F(xiàn)代碼

    跳轉(zhuǎn)非常常用,在哪里都一樣,這里的一些說明和用法也如此,不止適用于asp.net,其他語(yǔ)言也會(huì)用得到。跳轉(zhuǎn)的目的本來很簡(jiǎn)單,就是當(dāng)用戶或系統(tǒng)需要時(shí)從一個(gè)頁(yè)面轉(zhuǎn)向另一個(gè)頁(yè)面,但自從有了各種各樣的需求,還有那個(gè)什么SEO的東西之后,跳轉(zhuǎn)被搞得極其復(fù)雜
    2008-09-09
  • ASP.NET MVC懶加載如何逐步加載數(shù)據(jù)庫(kù)信息

    ASP.NET MVC懶加載如何逐步加載數(shù)據(jù)庫(kù)信息

    在ASP.NET MVC中實(shí)現(xiàn)數(shù)據(jù)庫(kù)的逐步加載可通過懶加載技術(shù)完成,首先,在EntityFramework中配置數(shù)據(jù)庫(kù)上下文,使用對(duì)應(yīng)的實(shí)體類映射數(shù)據(jù)庫(kù)表,本文給大家介紹ASP.NET MVC懶加載如何逐步加載數(shù)據(jù)庫(kù)信息,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • NET索引器使用方法實(shí)例代碼

    NET索引器使用方法實(shí)例代碼

    索引器允許類或結(jié)構(gòu)的實(shí)例按照與數(shù)組相同的方式進(jìn)行索引。索引器類似于屬性,不同之處在于它們的訪問器采用參數(shù),下面看一個(gè)小例子
    2013-11-11

最新評(píng)論

大城县| 阳曲县| 武清区| 五台县| 西宁市| 察雅县| 大厂| 西宁市| 旺苍县| 佛坪县| 佛坪县| 成武县| 黄浦区| 嘉荫县| 新营市| 韶关市| 磐安县| 隆昌县| 梨树县| 洛隆县| 泸定县| 宝清县| 石阡县| 长汀县| 汉阴县| 沙河市| 祁阳县| 南部县| 成都市| 澄城县| 刚察县| 乐业县| 油尖旺区| 岱山县| 淮南市| 通许县| 湛江市| 光山县| 含山县| 饶河县| 吴川市|