2011-06-02 62 views
0

我試圖遵循「從多線程程序 返回值」的標題下這裏http://msdn.microsoft.com/en-us/library/wkays279.aspx上市BackgroundWorker的例子C#BackgroundWorker的阻塞調用數據庫中DoWork的處理

我把一個耗時的調用數據庫中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. 
    } 

任何人都可以看到我在這裏失蹤?我通過調用WebService完成了相同類型的事情,並且似乎工作正常。

要調用DoWork異步後等待數據庫結果(或一些東西,塊UI線程)的下一行:

+0

其他地方訪問的數據庫?這確實是阻止主UI的DoWork調用? (這可能是一個紅鯡魚?) – 2011-06-02 02:47:02

+0

感謝您的迴應pst。我不確定我是否理解你的問題。你的意思是在調用RunWorkerAsync時是否有另一個進程調用數據庫?我看不到在別處訪問的數據庫。出於好奇,我評論說,在Retriever類中調用DB,並用While(true){}代替它。在我做到這一點之後,BackgroundWorker的行爲就像我期望的那樣。應用程序沒有阻塞,儘管有無限循環。 – Atari2600 2011-06-02 02:57:36

+0

你在做什麼'RetrieveLongDBCallThatReturnsADataSet'?這可能是問題所在...... – 2011-06-02 03:14:07

回答

0

,除非這是不應該的。

放在下一行一Break Point調用RunWorkerAsync之後,你應該立即得到流量(或者代碼添加到您的問題)

+0

- 感謝您的回覆。有趣......我在調用RunWorkAsync之後立即放置了一個斷點,並且我立即轉到了下一行。這是我感到困惑的地方。該行後面的行是一個Form.ShowDialog()。這種形式與我期待的數據庫結果沒有任何互動/期望,但是這種形式塊。所有形式的目的是做的是在結果回來時滾動進度條。 RunWorkerEventCompleted然後關閉該窗體。 – Atari2600 2011-06-02 03:16:51

+0

聽起來像問題是你沒有顯示的代碼。你如何更新進度條,以及「那個表單塊」是什麼意思?它完全沒有響應/它沒有更新進度欄/你可以移動它,但它沒有繪製控件? – Asher 2011-06-02 07:22:29

+0

感謝大家的回覆。事實證明,它是在RunWorkerCompleted事件觸發後執行的代碼。拋棄我的是當RunWorkerCompleted事件之後的代碼運行時,窗體仍然顯示在屏幕上。 RunWorkerCompleted事件中的代碼特別關閉了表單。我唯一能想到的是有一些重繪問題。在流的更下方添加斷點,向我展示哪些代碼被阻止。我已將該代碼移至BackgroundWorker,現在正在獲得我期待的結果。感謝所有迴應的人。 – Atari2600 2011-06-02 14:15:42