我有一个带有搜索表单的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循环完成后可以访问。但是,当在开始处放置一个断点时,它永远不会停在那里,循环本身是连续的无穷大......这意味着事件永远不会被触发。
我错过了什么吗?
答案 0 :(得分:3)
BackgroundWorker
进度&amp;已完成的事件将同步以在UI线程上运行。我猜你正在阻止那个线程,他们永远不会被解雇。