利用後臺程式System.ComponentModel.BackgroundWorker獲取股票這樣的資源資訊

iteye_4515發表於2011-11-30

今天拜讀了別人的程式碼,發現自己又一次孤陋寡聞.

System.ComponentModel提供了很多豐富的物件讓程式設計更簡單,很容易地達到你要實現的目的,避免自己寫更多的邏輯來實現你要的需求。

假設我們的產品是一個網站,它需要獲取internet上其它網站的資訊,比如股票,天氣預報。要獲取這樣的附屬資訊一般不能用主執行緒直接獲取,因為要頻繁地獲取這樣的資訊勢必會影響網

站的效能,那就用.net提供的後臺程式以非同步的方式來執行吧!多執行緒我們首先想到的是new System.Threading.Thread物件來實現,但我們這裡只是期望一個不怎麼“重要”的執行緒,或

者說不頻繁使用,或者是僅僅執行一個操作(可以理解為一個事件),那麼可以採用System.ComponentModel.BackgroundWorker來做更貼切。

看看他的用法:

1. 首先new 一個例項: private System.ComponentModel.BackgroundWorker backgroundGetData = new System.ComponentModel.BackgroundWorker();

2.定義一個後臺程式執行任務的事件,名稱為 BackgroundGetData_DoWork,型別是DoWorkEventHandler . 程式碼如下:

private void BackgroundGetData_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)

{

XDocument doc = XDocument.Load(url);

//很容易從這個doc裡面獲取天氣,股票資訊了,因為XDocument能夠把一個url例如http://www.nasdaq.com/aspxcontent/NasdaqRSS.aspx?data=quotes&symbol=CAC.

//怎麼處理這個xml來獲取這些資訊就不在這裡寫了。只需記住給System.Xml.Linq.XDocument傳入一個正確的url即可。

}

3.註冊這個事件: this.backgroundGetData.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BackgroundGetData_DoWork);

4.倒數第二步是非同步呼叫這個後臺程式.

很簡單,即使是不同程式間呼叫,只要知道這個後臺程式是定義在主執行緒裡的,所以只需知道這個後臺物件的例項,你就可以執行它裡面的方法:

/// <summary>
/// Retrieve the data on a separate thread. Async call.
/// </summary>
public void GetOnlineData()
{
System.Diagnostics.Trace.WriteLine("GetOnlineData(): Retrieving new data for the scroll queue.");
if (!this.backgroundGetData.IsBusy)
{
this.backgroundGetData.RunWorkerAsync();
}
}

5.最後就是不要忘記自己寫程式碼銷燬它。怎麼銷燬呢?定義了後臺程式的這個類實現這個IDisposable這個介面,在Dispose()方法裡寫程式碼就好了。

public void Dispose()
{
if (this.backgroundGetData != null)
{
this.backgroundGetData.Dispose();
this.backgroundGetData = null;
}
}

最後,補充一句,雖然System.ComponentModel.BackgroundWorker提供了非同步執行的機制,但是後臺程式如果頻繁執行非同步,比如每10秒執行一次,由於我的主程式是個使用WPF做效果的winform程式,後臺的非同步操作會影響到我主程式介面的執行效果,比如部分介面元素丟失,而且感覺程式執行效果會很卡。

相關文章