【问题标题】:HTML parsing-what kind of thread should i use?HTML 解析——我应该使用什么样的线程?
【发布时间】:2012-07-25 09:21:17
【问题描述】:

我有一个解析 html 文档的方法,但它需要很长时间并且 UI 冻结。所以我想使用一个线程,但我很困惑。线程有很多种,例如后台工作线程、调度程序等。我应该使用哪种类型的线程?另外,在我的方法中,我传递了一个参数。如果我使用线程,如何传递一个参数?

【问题讨论】:

  • 我经常使用Actions,但一个附带的问题是我们在谈论什么样的参数?
  • 我用html文档的url传递了一个字符串参数...

标签: c# wpf multithreading html-parsing backgroundworker


【解决方案1】:

这是一个使用后台工作者的示例代码:

// 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);

希望这会有所帮助!

【讨论】:

  • 我把我的代码放在了dowork中,但它看起来不像工作。我在 dowork 中有一个列表视图,但它没有填满。
  • 我有一种方法可以解析 html,然后动态创建一个列表视图,其中包含从 html 中获取的内容。在RunWorkerCompleted //enable 你这里的控件是什么意思?我可以在那里更新我的 ui 控件吗?谢谢!!
【解决方案2】:

自 WPF 以来,我不再使用后台工作程序。我听说它是​​为 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);
}

注意:不要将委托放在循环中,而是将循环放在委托中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2010-10-18
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2011-04-22
    相关资源
    最近更新 更多