backgroundworker没有触发RunWorkerCompleted事件

时间:2014-01-11 13:59:26

标签: c# multithreading backgroundworker

我有一个带有搜索表单的Web应用程序。该表单用于搜索我自己的数据库,但也可以通过其API服务搜索其他数据库。为了提供快速响应,我决定将工作拆分为主线程和后台工作服务。

这是我运行搜索任务的方法。

// search through other API
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.WorkerSupportsCancellation = true;
worker.WorkerReportsProgress = true;
worker.RunWorkerAsync(form);

// search in my api
...

// wait for API results
while (worker.IsBusy) {
    for (sbyte i = 0; i < sbyte.MaxValue; i++) ;
}
// handle data and show to user

方法是

private void worker_DoWork(object sender, DoWorkEventArgs e) {
    Forms f = e.Argument as Forms;
    if (f != null) {
        List<ApiResponse> result = GetDataFromOtherApi(f);
        e.Result = result;
    }
    else e.Result = null;
}

GetDataFromOtherApi()方法在单线程测试中正常工作。它在运行backgroundworker线程时也有效。我在结尾处设置了断点,e.Result具有我正在寻找的值。

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    List<ApiResponse> reply = e.Result as List<ApiResponse>;

    if (reply == null) ar = null;
    else if (reply.Any()) ar = reply;
    else ar = null;
}

ar是一个变量,主线程在while循环完成后可以访问。但是,当在开始处放置一个断点时,它永远不会停在那里,循环本身是连续的无穷大......这意味着事件永远不会被触发。

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

BackgroundWorker进度&amp;已完成的事件将同步以在UI线程上运行。我猜你正在阻止那个线程,他们永远不会被解雇。