我試圖遵循「從多線程程序 返回值」的標題下這裏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線程)的下一行:
其他地方訪問的數據庫?這確實是阻止主UI的DoWork調用? (這可能是一個紅鯡魚?) – 2011-06-02 02:47:02
感謝您的迴應pst。我不確定我是否理解你的問題。你的意思是在調用RunWorkerAsync時是否有另一個進程調用數據庫?我看不到在別處訪問的數據庫。出於好奇,我評論說,在Retriever類中調用DB,並用While(true){}代替它。在我做到這一點之後,BackgroundWorker的行爲就像我期望的那樣。應用程序沒有阻塞,儘管有無限循環。 – Atari2600 2011-06-02 02:57:36
你在做什麼'RetrieveLongDBCallThatReturnsADataSet'?這可能是問題所在...... – 2011-06-02 03:14:07