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

时间:2011-06-02 02:43:20

标签: c# backgroundworker

我正在尝试按照“从多线程过程返回值”标题下的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做了同样的事情,这似乎工作得很好。

1 个答案:

答案 0 :(得分:0)

除非:

,否则不会发生这种情况

在异步调用DoWork之后,您正在等待下一行的数据库结果(或阻止UI线程的内容)。

在调用Break Point后将RunWorkerAsync放在下一行,您应立即获得流程(或将该代码添加到您的问题中)