2012-07-25 51 views
0

我有一個解析到html文件的方法,但它需要很長時間,UI凍結。所以我想使用一個線程,但我很困惑。線程有很多種,如後臺工作人員,調度員等。我應該使用哪種類型的?另外,在我的方法中,我傳遞了一個參數。如果我使用線程,如何傳遞一個參數?HTML解析 - 我應該使用哪種線程?

+0

我經常使用Actions,但是一個側面的問題是我們在談論什麼樣的參數? – Silvermind 2012-07-25 09:23:48

+0

我通過一個字符串參數與HTML文檔的URL ... – user1005633 2012-07-25 10:31:22

回答

0

下面是一個例子代碼中使用背景工人:

// I usually disable controls (buttons, etc.) 
// so user is prevented to perform other 
// actions 
BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += (s, e) => 
{ 
    // Get the parameter 
    var param = e.Argument as <your expected object> 
    // Perform parsing 
} 
worker.RunWorkerCompleted += (s1, e1) => 
{ 
    System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(
     new Action(() => 
     { 
      // enable you controls here 
     })); 
} 
worker.RunWorkerAsync(parameter); 

希望這有助於!

+0

我把我的代碼在dowork,但它看起來不喜歡工作。我在dowork中有一個listview,它沒有填充。 – user1005633 2012-07-25 10:55:41

+0

在做工作中列表視圖的目的是什麼? – lionheart 2012-07-26 08:36:23

+0

我有一個方法,我解析一個HTML,我動態創建一個列表視圖與我從html獲得的內容。在RunWorkerCompleted中//使你在這裏控制什麼意思?我可以在那裏更新我的UI控件嗎?謝謝!! – user1005633 2012-07-26 08:52:36

0

自WPF以來,我不再使用backgroundworkers。我聽說它是​​爲WinForms創建的,應該在WPF中避免,但我可能會誤解。 既然你傳遞一個字符串作爲參數(而不是一些UI控件)應該有訪問另一個線程像這樣沒有問題:

private void DoStuff(string documentName) 
{ 
    Action a =() => 
    { 
     var result = ParseFile(documentName); 
     Action b =() => 
     { 
      TextBox1.Text = result; 
     }; 
     Dispatcher.BeginInvoke(b); 
    }; 
    a.BeginInvoke(callback => 
    { 
     a.EndInvoke(callback); 
    }, null); 
} 

注意:不要把代表一個循環中,而把循環在代表內部。