2012-08-25 69 views
2

我已經讓自己成爲一個讀取RSS提要並將它們返回給我的主類的類。我用這個代碼是:當閱讀RSS訂閱時程序鎖定

public List<Post> getLatestPosts() 
{ 
    this.rssReader = new XmlTextReader(this.rssUrl); 
    this.rssDoc = new XmlDocument(); 

    // Load the XML content into rssDoc 
    rssDoc.Load(rssReader); 

    // ... other code to parse XML ... // 
} 

現在,當我打電話getLatestPosts()我的應用程序鎖定了幾秒鐘。我假設這是因爲這是應用程序請求RSS提要需要多長時間(網絡延遲等)。

我想改變這個,所以我的程序不鎖定,而是等待響應。我的想法是使用主表單中的線程,但我對如何捕獲任何RSS數據獲取的任何RSS數據感到困惑。

如果我這樣做,我的按鈕點擊我的主要形式:

private void bGetLatestPosts_Click(object sender, EventArgs e) 
{ 
    Thread thread = new Thread(new ThreadStart(rssReader.getLatestPosts())); 
} 

我不會捕捉任何getLatestPosts()回報。

我完全陌生的線程(這大部分只是我亂搞,嘗試和學習),但我確實有一些在C#中的經驗。

謝謝。

回答

2

我假設你正在寫一個WinForms應用程序。有兩個重要的規則來編寫響應的WinForms應用程序:

  • 您在主UI線程上做的所有事情都應該快速完成。
  • 您不能從主線程以外的任何線程訪問控件。

要解決您的問題,請在BackgroundWorker中運行您的代碼。

BackgroundWorker類允許您在單獨的專用線程上運行操作。諸如下載和數據庫事務等耗時的操作可能會導致您的用戶界面(UI)看起來好像在運行時停止響應一樣。如果您想要一個響應式用戶界面,並且您面臨着與此類操作相關的長時間延遲,則BackgroundWorker類提供了一個便捷的解決方案。

要在後臺執行耗時的操作,請創建一個BackgroundWorker並偵聽報告操作進度並在操作完成時發出信號的事件。您可以編程方式創建BackgroundWorker,也可以從工具箱的「組件」選項卡將其拖到表單上。如果在Windows窗體設計器中創建BackgroundWorker,它將出現在組件托盤中,並且其屬性將顯示在「屬性」窗口中。

要設置後臺操作,請爲DoWork事件添加事件處理程序。在此事件處理程序中調用您的耗時操作。要啓動該操作,請調用RunWorkerAsync。要接收進度更新通知,請處理ProgressChanged事件。要在操作完成時接收通知,請處理RunWorkerCompleted事件。

下面是一些代碼,可以幫助你:

private void bGetLatestPosts_Click(object sender, EventArgs e) 
{ 
    bGetLatestPosts.Enabled = false; 
    backgroundWorker.RunWorkerAsync(); 
} 

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    e.Result = getLatestPosts(); 
} 

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     // Handle exception... 
    } 
    else 
    { 
     List<Post> result = (List<Post>)e.Result; 
     // Update GUI... 
    } 
    bGetLatestPosts.Enabled = true; 
} 
+0

感謝,背景工人正是我想要的。並再次感謝按鈕關閉技巧,沒有想到這一點。 :) –