首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BackgroundWorker工作不正常

BackgroundWorker工作不正常
EN

Stack Overflow用户
提问于 2015-07-01 12:44:45
回答 4查看 4.6K关注 0票数 0

我使用后台工作人员,因为我的程序中的某些方法需要时间从互联网下载数据。这个方法“阻止”了5-6秒的软件,所以我希望使用后台工作人员像线程一样执行该方法。在我的课堂上,我创建了以下内容:

代码语言:javascript
复制
 private BackgroundWorker worker = new BackgroundWorker();

在ComboBox选择更改之后,我以这样的方式调用BackgroundWorker:

代码语言:javascript
复制
worker.DoWork += new DoWorkEventHandler(doWork);

doWork方法包含:

代码语言:javascript
复制
public void doWork(object sender, DoWorkEventArgs e)
{
        classifica.getClassifica(); //call the method from another class
}

现在我的问题是,doWork方法不是由BackgroundWorker调用的。我做错什么了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-01 12:49:19

我想你是在找这个:

代码语言:javascript
复制
if (worker.IsBusy != true)
{
    worker.RunWorkerAsync();
}

尽管除非设置在BackGroundWorker上或不能针对.NET 4.5,否则我强烈建议使用WebClient.DownloadDataAsync

像这样使用它:

代码语言:javascript
复制
static void DownloadData()
{
    string url = "http://google.com";
    WebClient client = new WebClient();
    client.DownloadDataCompleted += DownloadDataCompleted;
    client.DownloadDataAsync(new Uri(url));
}

static void DownloadDataCompleted(object sender,
DownloadDataCompletedEventArgs e)
{
    // Handle returned data here
}

所有这些都是为了你而不用其他任何东西。很简单!

票数 0
EN

Stack Overflow用户

发布于 2015-07-01 12:48:08

你必须启动工人。

代码语言:javascript
复制
 worker.RunWorkerAsync();
票数 2
EN

Stack Overflow用户

发布于 2015-07-01 12:48:20

你必须打电话给worker.RunWorkerAsync();才能启动工人。还有一个重载,允许您将object参数传递给您的DoWork函数:

代码语言:javascript
复制
void RunWorkerAsync(object argument)

您还可以添加一个处理程序,以便知道工作人员何时完成:worker.RunWorkerCompleted。在这个处理程序中,您可以访问DataGrid,因为它将在UI线程中(假设您在UI线程中创建了工作人员)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31161703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档