【问题标题】:I want to know how to use BackgroundWorker so the app won't freeze我想知道如何使用 BackgroundWorker 这样应用程序就不会冻结
【发布时间】:2014-08-10 01:09:35
【问题描述】:

我有一个 winform 应用程序,它应该从 web 请求中获取数据,当我点击开始按钮时它可以工作,但是在加载的那几秒钟内它不会响应并冻结。 我是一个初学者,我听说有类 backgroundWorker 但我不能让它在我的代码上工作而不给我一个错误,比如“你需要在你创建的线程上使用它”。

这里是按钮点击的代码:

WebClient webURL = new WebClient();
        Stream stream = webURL.OpenRead(url);
        htmlDoc.Load(stream);

        HtmlNode chartNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id='top40']");

        listBoxChart.Items.Clear();
        foreach (var item in GetChart(chartNode))
        {
            listBoxChart.Items.Add(item);
        }

感谢您的回复!

编辑:

好的。这里是:

“附加信息:此 BackgroundWorker 当前很忙,无法同时运行多个任务。” 按钮点击:

void btnGetChart_Click(object sender, EventArgs e)
    {
        listBoxChart.Items.Clear();
        listBoxChart.Items.Add("Please Wait. . .");
        listBoxChart.Items.Clear();
        backgroundWorker1.RunWorkerAsync();
    }

backGroundWorker DoWork:(上面有更多的 webrequest 代码,但就是循环):

foreach (var item in GetChart(chartNode))
{       
listBoxChart.Items.Add(item);
}

它还说:

“附加信息:跨线程操作无效:控件'listBoxChart'从创建它的线程以外的线程访问。”

【问题讨论】:

  • 如果您不知道如何使用BackgroundWorker,您应该阅读众多在线教程之一。如果您知道如何使用但遇到错误,您需要发布代码并告诉我们您遇到了什么错误。您不应该做的是让互联网上的人编写您的代码,然后在不理解的情况下将其放入您的应用程序中。

标签: multithreading winforms backgroundworker


【解决方案1】:

事件用来写你所有的代码是DoWork。您可以将所有代码放在该事件中。一旦你调用了RunWorkerAsync 方法,DoWork 事件就会被触发。完成整个过程后,最终BackgroundWorker 将引发RunWorkerCompleted 事件。您可以在哪里确定该过程已完成。

有完整的例子说明你可以找到here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多