国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

使用ADO.NET2.0提升數(shù)據(jù)交互性能(2)_.Net教程

2024-07-10 12:51:27
字體:
供稿:網(wǎng)友

推薦:使用ADO.NET2.0提升數(shù)據(jù)交互性能(1)
前言:這篇文章起源于在公司寫的一個PPT,但是由于PPT本身的限制很多內(nèi)容無法表達(dá)或是詳細(xì)的解釋,于是變下定了決心。寫篇文檔!在這篇文章里我將盡量簡單的描述下ADO.NET 2.0的新特

三:異步執(zhí)行Command命令

在 ADO.NET 2.0 以前,通過 Command 類(如 SqlCommand、OleDbCommand等)執(zhí)行 SQL

命令的線程一定要停下來等待執(zhí)行結(jié)果。ADO.NET 2.0 新增了異步程序訪問接口(asynchronous API),讓線程發(fā)出命令后可以繼續(xù)執(zhí)行接下去的程序代碼。

而在 ADO.NET 2.0 當(dāng)前的版本只有 SqlClient 支持異步程序訪問接口。

以往編寫程序時,我們可以直接通過.NET Framework 所提供的多線程機(jī)制,或是以 Delegate 類包裝多線程的方式,在 .NET Framework 所提供的異步架構(gòu)下,設(shè)計調(diào)用執(zhí)行 Command 對象實例。這些方法都是讓一條工作線程(Worker Thread)停止在后臺中等待執(zhí)行結(jié)果,一旦有結(jié)果后,工作線程再通過標(biāo)準(zhǔn)的機(jī)制告知結(jié)果。

原本 ADO.NET 的 Command 對象執(zhí)行 SQL 語法的方法有

ExecuteReader、ExecuteNonQuery、ExecuteXmlReader 以及 ExecuteScalar 等,搭配 .NET

Framework 原來就提供的異步模型慣例,除了 ExecuteScalar 方法外,其余的方法都新增了以 Begin 和 End 關(guān)鍵字開始的一對方法。也就是說 ExecuteReader 方法是同步執(zhí)行,若要以異步的方式執(zhí)行相同的功能,則調(diào)用 BeginExecuteReader 和 EndExecuteReader 這一組方法。在 .NET Framework 中,以 Begin 為字首的方法負(fù)責(zé)傳入同名方法所需的參數(shù),而以 End

為字首的方法用來取回執(zhí)行結(jié)果,

例如某個方法的定義如下:

public override int ExecuteNonQuery()

則以異步調(diào)用的起始方法定義如下:

public IAsyncResult BeginExecuteNonQuery(AsyncCallback callback, object stateObject)

Begin~ 系列的方法會多加存放回調(diào)方法(Delegation)的指針參數(shù),也就是上述語法中的 callback 參數(shù)。并提供語法中的 stateObject參數(shù),讓你設(shè)置想要帶到 End~ 對應(yīng)方法的信息。而 Begin~ 系列方法最后返回的是代表異步執(zhí)行狀態(tài)的 IAsyncResult 對象實例,而不是原本同步執(zhí)行方法的返回結(jié)果,你可以藉此查詢異步執(zhí)行的狀況。

而獲得執(zhí)行結(jié)果的方法定義如下:

public int EndExecuteNonQuery(IAsyncResult asyncResult)

在調(diào)用與 Begin~ 對應(yīng)的 End~ 方法時,需要帶入 Begin~ 方法所返回的 IAsyncResult

對象實例。異步執(zhí)行完畢后,取回與原先同步執(zhí)行方法相同的執(zhí)行結(jié)果。


由于我們在執(zhí)行完 Command 對象訪問數(shù)據(jù)庫的方法后,都會返回對象,如 ExecuteReader 取回 DataReader實例;ExecuteNonQuery 取回受影響的記錄條數(shù);ExecuteXmlReader 取回 XmlReader 實例。因此大概都需要通過End系列方法來獲得執(zhí)行結(jié)果,否則這些結(jié)果就遺失在系統(tǒng)中。

若要異步執(zhí)行 Command 命令,另一個必需設(shè)置的是:數(shù)據(jù)庫連接字符串內(nèi)要加上 async=true 屬性。若連接字符串沒有加上該屬性,而通過 Command對象實例調(diào)用異步執(zhí)行的方法,則會產(chǎn)生異常(exception)。若 Command 通過連接執(zhí)行時,重頭到尾都是以同步的方式執(zhí)行,則依照默認(rèn) async=false 的方式設(shè)置比較節(jié)省資源。若某些命令需要同步執(zhí)行,另一些需要異步執(zhí)行,則可以考慮使用不同的連接。

在介紹范例應(yīng)用程序前,我們先稍微談一下 .NET Framework 所提供的公共的異步運(yùn)行應(yīng)用程序設(shè)計模式,不只是 ADO.NET2.0,在其他訪問耗時的程序編寫上,也都可以套用這個模式。

.NET Framework內(nèi)置了讓應(yīng)用程序異步運(yùn)行的功能,讓你在編寫應(yīng)用程序時,不會因為某些耗時等待的操作讓程序停止響應(yīng),操作界面停滯讓用戶感覺起來好像死機(jī)一樣。一般會以多線程的方式處理這種需求,但若你不熟悉線程的運(yùn)行,或是想利用線程池(Thread Pool)的好處,都可以在較為耗時的操作上,采用 .NET Framework 所提供的異步功能。

一般來說文件 I/O、網(wǎng)絡(luò)訪問乃至于 Web Services 訪問,以及本節(jié)所討論的 DB 訪問等都較為耗時,.NET Framework為這一類的類都提供了上述以 Begin~/End~開頭的非同步執(zhí)行方法,而這些方法皆成對出現(xiàn)。當(dāng)然,也有可能是自己編寫的方法其商業(yè)邏輯非常復(fù)雜,導(dǎo)致調(diào)用該方法后,需要等待一段時間來完成,這時還可以通過 .NETFramework 所提供的委托(Delegate)類來創(chuàng)建異步運(yùn)行。

但是實際在我們的應(yīng)用中,

但我們不需要獲知DB服務(wù)器的返回信息時,我們推薦使用委托,尤其是在Web開發(fā)中。

因為在頁面線程啟動異步數(shù)據(jù)庫訪問時,當(dāng)頁面業(yè)務(wù)執(zhí)行完畢后仍然無法放開訪問數(shù)據(jù)庫的異步線程。這是我們不希望看到的,但是使用委托卻可以避免這個麻煩(webservice異步應(yīng)用中一樣如此)。

分享:揭秘ASP.NET常用的26個優(yōu)化性能方法
1. 數(shù)據(jù)庫訪問性能優(yōu)化 數(shù)據(jù)庫的連接和關(guān)閉訪問數(shù)據(jù)庫資源需要創(chuàng)建連接、打開連接和關(guān)閉連接幾個操作。這些過程需要多次與數(shù)據(jù)庫交換信息以通過身份驗證,比較耗費(fèi)服務(wù)器資源。ASP.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松原市| 鸡东县| 含山县| 新沂市| 西畴县| 固始县| 漳州市| 德兴市| 徐汇区| 安西县| 华宁县| 政和县| 钟山县| 成都市| 邹城市| 柳河县| 青川县| 东方市| 衡阳市| 上犹县| 南乐县| 潮州市| 宁乡县| 上杭县| 夏津县| 乌海市| 青冈县| 息烽县| 夏津县| 阿拉尔市| 锦屏县| 彭水| 松滋市| 大城县| 泸西县| 肇庆市| 广昌县| 隆德县| 石门县| 西林县| 铁岭县|