簡體   English   中英

C# BackgroundWorker 在 DoWork 處理程序中阻塞數據庫調用

[英]C# BackgroundWorker blocking on Database call in DoWork handler

我正在嘗試遵循“從多線程過程返回值”標題下列出的 BackgroundWorker 示例http://msdn.microsoft.com/en-us/library/wkays279.aspx

我在 BackgroundWorker 的 DoWork 事件處理程序中對數據庫進行了耗時的調用。 我希望一旦我調用 BackgroundWorkerAsync(object),該調用將在后台發生,並且不會阻止應用程序的 rest 執行。 問題是這不會發生。 整個應用程序鎖定並等待數據庫調用返回。 一旦它返回,應用程序就會再次響應。

這是我的代碼

    //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 做了同樣的事情,這似乎工作正常。

這不應該發生,除非:

在異步調用DoWork之后,您正在等待下一行的數據庫結果(或阻塞 UI 線程的內容)。

在調用RunWorkerAsync后在下一行放置一個Break Point ,您應該立即獲得流程(或將該代碼添加到您的問題中)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM