C#BackgroundWorker在DoWork处理程序中阻止数据库调用
我试图遵循“从多线程过程返回值”标题下列出的BackgroundWorker示例 " 我在BackgroundWorker的DoWork事件处理程序中对数据库进行了耗时的调用。我希望一旦调用BackgroundWorkerAsync(object),该调用将在后台进行,而不会阻止应用程序的其余部分执行。问题是这不会发生。整个应用程序将锁定并等待数据库调用返回。一旦返回,应用程序将再次响应 这是我的密码C#BackgroundWorker在DoWork处理程序中阻止数据库调用,c#,backgroundworker,C#,Backgroundworker,我试图遵循“从多线程过程返回值”标题下列出的BackgroundWorker示例 " 我在BackgroundWorker的DoWork事件处理程序中对数据库进行了耗时的调用。我希望一旦调用BackgroundWorkerAsync(object),该调用将在后台进行,而不会阻止应用程序的其余部分执行。问题是这不会发生。整个应用程序将锁定并等待数据库调用返回。一旦返回,应用程序将再次响应 这是我的密码 //initialization in a method. Worker.D
//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.
}
有人能看到我在这里遗漏了什么吗?我通过调用Web服务做了同样的事情,看起来效果不错 除非: 在异步调用
DoWork
之后,您将在下一行等待数据库结果(或阻止UI线程的内容)
调用
RunWorkerAsync
后,在下一行添加一个断点
,您应该立即获得流程(或将该代码添加到您的问题中)数据库是否在其他地方访问?确实是DoWork
调用阻塞了主UI?(这可能是在转移视线吗?)谢谢pst的回复。我不确定我是否理解你的问题。您的意思是,在我调用RunWorkerAsync时,是否有另一个进程调用DB?我看不到数据库在其他地方被访问。出于好奇,我注释掉了Retriever类中的DB调用,并将其替换为While(true){}在我这样做之后,BackgroundWorker的行为与我预期的一样。应用程序没有阻塞,尽管存在无限循环。在retrievelongdbcallthattreturnsadataset
中,您在做什么?这可能就是问题所在……//预期开始执行的代码。那里不应该有代码。将其移动到RunWorkerCompleted事件处理程序。-感谢您的回复。有趣的我在调用RunWorkAsync之后放置了一个断点,并立即转到下一行。这就是我感到困惑的地方。下一行后面的一行是Form.ShowDialog()。该表单与我期望返回的DB结果没有交互/期望,但该表单会阻塞。该表单只需在返回结果时滚动一个进度条。RunWorkerEventCompleted然后关闭该表单。听起来问题出在您没有显示的代码中。你是如何更新进度条的?你所说的“那个表单块”是什么意思?它是否完全没有响应/它没有更新进度条/你能移动它但它没有绘制控件吗?谢谢大家的回答。原来是在RunWorkerCompleted事件触发后执行的代码。让我不高兴的是,当RunWorkerCompleted事件之后的代码运行时,表单仍然显示在屏幕上。RunWorkerCompleted事件中的代码专门关闭了表单。我唯一能想到的就是重新粉刷的问题。在流的下游添加断点,向我显示了哪些代码被阻塞。我已经将该代码转移到了一个BackgroundWorker,现在得到了我所期望的结果。感谢所有回应的人。