C#BackgroundWorker在DoWork处理程序中阻止数据库调用

C#BackgroundWorker在DoWork处理程序中阻止数据库调用,c#,backgroundworker,C#,Backgroundworker,我试图遵循“从多线程过程返回值”标题下列出的BackgroundWorker示例 " 我在BackgroundWorker的DoWork事件处理程序中对数据库进行了耗时的调用。我希望一旦调用BackgroundWorkerAsync(object),该调用将在后台进行,而不会阻止应用程序的其余部分执行。问题是这不会发生。整个应用程序将锁定并等待数据库调用返回。一旦返回,应用程序将再次响应 这是我的密码 //initialization in a method. Worker.D

我试图遵循“从多线程过程返回值”标题下列出的BackgroundWorker示例 "

我在BackgroundWorker的DoWork事件处理程序中对数据库进行了耗时的调用。我希望一旦调用BackgroundWorkerAsync(object),该调用将在后台进行,而不会阻止应用程序的其余部分执行。问题是这不会发生。整个应用程序将锁定并等待数据库调用返回。一旦返回,应用程序将再次响应

这是我的密码

    //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,现在得到了我所期望的结果。感谢所有回应的人。