我正在尝试按照“从多线程过程返回值”标题下的http://msdn.microsoft.com/en-us/library/wkays279.aspx中列出的BackgroundWorker示例 “
我在BackgroundWorker的DoWork事件处理程序中对数据库进行了耗时的调用。我希望一旦我调用BackgroundWorkerAsync(对象),这个调用将在后台发生,而不是阻止执行的其余应用程序。问题是这不会发生。整个应用程序锁定并等待数据库调用返回。一旦它返回,应用程序再次响应。
这是我的代码
//initialization in a method.
Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
Retriever temp = (Retriever)e.Argument;
e.Result = temp.RetrieveLongDBCallThatReturnsADataSet() //App blocks until done.
}
private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
System.Data.DataSet result = (System.Data.DataSet)e.Result;
//Do stuff with the DataSet.
}
public void Retrieve(object arg1, object arg2, object arg3)
{
Retriever temp = new Retriever();
InitializeBackgroundWorker(); //wire up events
temp.Prop1 = arg1;
temp.Prop2 = arg2;
temp.Prop3 = arg3;
Worker.RunWorkerAsync(temp);
//Code that is expected to start executing, but instead blocks until temp.RetrieveLongDBCallThatReturnsADataSet() finishes.
}
谁能看到我在这里失踪的东西?我通过调用WebService做了同样的事情,这似乎工作得很好。
答案 0 :(得分:0)
除非:
,否则不会发生这种情况在异步调用DoWork
之后,您正在等待下一行的数据库结果(或阻止UI线程的内容)。
在调用Break Point
后将RunWorkerAsync
放在下一行,您应立即获得流程(或将该代码添加到您的问题中)