后台工作线程未触发运行工作线程已完成事件



我有一个带有搜索表单的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()方法在单线程测试中工作正常。它在运行后台工作线程时也有效。我在最后设置了一个断点,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 循环完成运行后可以访问的变量。但是,当在开始时放置断点时,它永远不会停在那里,循环本身是连续到无穷大的......这意味着事件永远不会被触发。

我错过了什么吗?

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

最新更新