我想知道如何使用BackgroundWorker,以便应用程序不会冻结

时间:2014-08-10 01:09:36

标签: multithreading winforms backgroundworker

我有一个winform应用程序,它应该从Web请求中获取数据,当我点击开始按钮时,它可以工作,但是对于那些加载秒,它将不会响应并冻结。 我是一个初学者,我听说有类backgroundbusiness,但我不能让它在我的代码上工作,而不会给我一个类似&#34的错误;你需要在你创建的线程上使用它#" 34。

以下是按钮点击的代码:

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

它也说:

"附加信息:跨线程操作无效:Control' listBoxChart'从其创建的线程以外的线程访问。"

1 个答案:

答案 0 :(得分:0)

该事件用于编写所有代码DoWork。您可以将所有代码放在该事件中。调用方法RunWorkerAsync后,将引发DoWork事件。完成整个过程后,最后BackgroundWorker将提出RunWorkerCompleted事件。您可以在哪里确定该过程已经完成。

有完整的说明示例,您可以找到here