2009年1月25日 星期日

C# 如何使用 Backgroundworker

在 .net 2.0 之後,出現了一個可以與 Thread 相當類似功能的物件
叫做 Backgroundworker
在這不討論兩者的性能比較,僅只稍微說明如何使用
這個物件使用起來蠻方便的,有點像是進階型的 Thread

1. Backgroundworker 的作用
相當於 Thread,這個物件可以讓開發者建立一個在背景執行的工作
而不影響前端的表現,亦即前端可以讓使用者繼續操作
Backgroundworker 會默默的執行其運作的項目
通常可以用在處理需要較久時間的資料
MSDN 提供了幾個例子
*影像下載
*Web 服務引動過程
*檔案下載與上載 (包含在點對點應用程式中)
*複雜的本機計算
*資料庫交易
*本機磁碟存取 (相對於記憶體存取,速度較慢)

2.Backgroundworker 常用的幾個成員

成員名稱 說明
WorkerReportsProgress 布林值,設定或取得是否可以報告更新進度
DoWork 委派,指示要做的工作方法
ProgressChanged 委派,指示當回報進度時要做的方法
RunWorkerCompleted 委派,指示當工作完成時要執行的方法
RunWorkerAsync 方法,開始同步執行背景作業
IsBusy 布林值,取得是否正在執行非同步作業
CancellationPending 布林值,取得是否已經要求取消背景作業
WorkerSupportsCancellation 布林值,取得或設定是否支援非同步取消

3. Backgroundworker 的使用方法
先初始化
bgwkr.WorkerReportsProgress = true;
bgwkr.DoWork += new DoWorkEventHandler(bgwkr_DoWork);
bgwkr.ProgressChanged += new ProgressChangedEventHandler(bgwkr_ProgressChanged);
bgwkr.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgwkr_RunWorkerCompleted);

要求開始工作
bgwkr.RunWorkerAsync();
工作內容的方法
private void bgwkr_DoWork(object sender, DoWorkEventArgs e)
{
    // 工作內容…

當回報工作進度時呼叫,這邊可以改變前端控制項的內容
private void bgwkr_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    this.tbInf.Text += "Proceeding, please wait...\n";
    this.pbProgress.Value = e.ProgressPercentage;
}

當工作完成時呼叫,這邊可以改變前端控制項的內容
private void _bgwkr_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    this.tbInf.Text += "Finish..";
    this.btOK.IsEnabled = true;

使用起來非常的方便
至於效能感覺上用起來沒有比 Thread 差
當然還要再做進一步的測試才知道

2009年1月19日 星期一

使用 WebClient 取得網頁內容

以前,要抓取網頁的內容,需要搞懂一點點的網路串流傳輸知識
現在 .net 挺方便的
只要用一個 WebClient 的物件就可以達成了
而且超輕鬆
以下程式碼使用 C#

如果要下載抓取網頁頁面的 HTML 碼 using (WebClient wc = new WebClient())
{
    string sHTML = wc.DownloadString(sStockCategoryUri);
}
然後整頁的 HTML 就都放在 sHTML 了
啥咪!?這樣就好了?
對,真的很方便
抓好之後就可以慢慢的對 HTML 下刀了,嘿嘿

這個 WebClient 還有其他功能哦
像是可以抓檔案的 DownFile()
上傳檔案的UploadFile()
上傳參數然後抓取回應的 UploadValue()
都蠻方便使用的

參考資料:
MSDN WebClient http://msdn.microsoft.com/zh-tw/library/system.net.webclient.aspx

2009年1月7日 星期三

ASP.NET 儲存及傳遞資料的網頁變數

在 ASP.NET 的網頁中,有幾個變數可以讓我們暫時儲存資訊及傳遞資訊給別的頁面
Application
Session
ViewState
Cache
Cookies
QueryString
Hidden Field
如能善用這些變數,在伺服器的效能或是頻寬的使用上,都能夠更有效益
因此對於這七個變數,以下僅就小弟所知道的列一張簡單的表,再加以簡單說明

ASP.NET 網頁用變數表
  存放位置 存活長度 存取範圍
Application Server Memory 開始:網頁應用程式開啟(Application_Start)
結束:網頁應用程式結束(Application_End)
全域(整個應用程式)
Session Server Memory 開始:Client 存取頁面
結束:Client 存取頁面後一段時間
單一個用戶
ViewState Client Page 與 Page 共存亡 單一個用戶
Cache Server Cache 可設定存活起訖 全域(整個應用程式)
Cookies Client Memory 可設定存活起訖 單一個用戶
QueryString 網址列 與網址共生死 單一個用戶
HiddenField Client Page 與 Page 共存亡 單一個用戶

 

ASP.NET 網頁變數使用方法及時機

1.Application

Application Variables 的使用方法:
Application.Lock(); // 鎖住 Application
Application["Count"] = (int)Application["Count"] + 1;
Application.UnLock(); // 解開 Application
要注意的是使用 Application Variable 的時候要先取得使用權, 避免同步寫入。
就像使用廁所的時候要敲門,進入廁所之後要鎖門,否則同時間有人要使用,就尷尬了。
還有另一點需要注意,Application 候寫入僅能在 Global.asax 內操作。

Application Variables 的使用時機:
因為 Application 這個變數是個全域變數,任何的使用者頁面都可以使用,因此在使用上需要事先規劃且注意,再者,Application 是佔用 Server 的記憶體,如果放太多的資訊在裡面,又不常用到,只是徒然浪費 Server 的記憶體空間。因此 Application 多被用來儲存需經常存取的網站資料,幾乎每個頁面都會存取的,像是造訪人數計數、最新訊息、目前線上人數……等等。

2.Session

Session Variables 的使用方法:
Session["Count"] = (int)Session["Count"] + 1;
Session Variables 的使用時機:
Session 這個變數的特性是跟隨 Client 的存取而存在,而又佔用到 Server 的記憶體,因此也不能夠大量的使用。每個 Client 端都有其唯一的 Session ID,利用這個 ID 即可以做出許多的變化(待日後再說明)。所以我們可以想到, Session Variables 大都被使用來存放專屬於 Client 經常存取的資訊。像是會員ID、名稱之類的訊息。

3.ViewState

ViewState Variables 的使用方法:
ViewState["Count"] = (int)ViewState["Count"] + 1; 如果頁面沒有需要使用 ViewState,可以透過 @Page 指示詞加上 EnableViewState = false 屬性,減少傳回的資料量,以減少頻寬使用量。或是針對不需要傳回訊息的元件,設定其 EnabledViewState = false(已是預設值)。

ViewState Variables 的使用時機:
尤於 ViewState 是跟隨每一個 Page 而存活,且不佔記憶體空間,因此非常適合拿來使用在頁面之間傳遞訊之用,但是如果資料量過大,會影響到頻寬的使用量。通常都被使用來給 Client 端使用者輸入資料使用。

4.Cache

Cache Variables 的使用方法:
<%@ OutputCache duration="100" varybyparam="none" %>
Cache.Insert("Count","0"); // 建立
Cache["Count"] = (int)Cache["Count"] + 1; // 存取

Cache Variables 的使用時機:
Cache 的資料存放在 Server 端的快取記憶體中,因此如大量使用會影響到 Server 的快取記憶體使用量。但如果 Cache 用的好,Server 的負擔可以減少很多。下面列一些文章,歡迎大家參考看看。

有關於 Cache 的使用介紹文章:
MSDN http://msdn.microsoft.com/zh-tw/library/h30h475z.aspx
MIS2000 Lab. http://www.dotblogs.com.tw/mis2000lab/archive/2008/09/12/5364.aspx
邦邦的部落格 http://blog.ben.idv.tw/2008/12/aspnet-cache.html

5.Cookies

Cookies Variables 的使用方法:
Cookies["Count"] = (int)Cookies["Count"] + 1;
Cookies Variables 的使用時機:
因為 Cookies 是放在 Client 端的檔案中,又可自行設定存活時間,因此經常被拿來使用存放一些較不敏感的資訊,以供使用者下次再登入時使用。像是使用者下次進入網站時是否自動登入、加密過的帳密、喜好的版面配置……等等。

6.QueryString

QueryString Variables 的使用方法:
Response.Redirect("http://Default.aspx?Count=0&ID=3");
QueryString Variables 的使用時機:
因 QueryString 的容量小(可存放255 字元)及不佔記憶體的特性,因此經常被用來當為查詢字串,比如查詢網站內的某一篇文章或是某個貨品的資訊。

7.HiddenField

HiddenField Variables 的使用方法:
HiddenField1.Value = (int)HiddenField1.Value + 1;
HiddenField Variables 的使用時機:
HiddenField 為 Page 裡的一個元件,只是不會被瀏覽器顯示,和 ViewState 性質很像。同樣也有使用量大時,佔用頻寬的缺點。