2012-07-25 50 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); 
} 

注意:不要把代表一个循环中,而把循环在代表内部。