2009-06-16 56 views
2

我一開始就在我的WinForms客戶端中使用了異步操作,但僅限於某些操作。當ExecuteReaderExecuteNonQuery完成時,回調委託觸發,一切正常。多個異步SqlClient操作 - 尋找一個好例子

我基本上有兩個問題:

1)什麼是這個在現實生活中的系統處理的最佳結構?我見過的所有例子都是玩具的例子,表格處理操作完成,然後打開EndExecuteReader上的數據讀取器。當然,這意味着表單比您通常喜歡的更緊密地耦合到數據庫。當然,這個表格總是可以很容易地自行調用.Invoke。我已將所有異步對象設置爲從AsyncCtrlBlock<T>類繼承,並將表單和所有回調委託提供給我的DAL中的異步對象的構造函數。

2)我將重新訪問當前不是異步的程序的一部分。它連續打了兩個電話。當第一個完成時,模型的一部分可以填充。當第二部分完成時,模型的其餘部分可以完成 - 但只有在第一部分已完成時纔可以完成。什麼是最好的方式來構建這個?如果能夠完成第一次讀取並且由於第一次讀取的處理正在進行而第二次讀取的處理正在進行中,但是我不希望第二次讀取的處理開始,直到我知道處理第二次讀取第一次讀取的數據已經完成。

+0

「這將是巨大的,如果第一次讀可以做到,並且由於該處理的第一讀取,而第二個推出的是正在進行中,但我不希望開始第二次讀取的處理直到我知道第一次讀取的數據的處理已經完成。「 -----你的意思是第一個和第二個應該同時開始執行,但是你不想在第一個完成之前完成第二個完成? – 2009-07-09 04:23:29

+0

在第一個完成事件的處理完成之前,我不會開始處理第二個完成事件。即第一個查詢獲得一組節點,第二個查詢獲得一組行。我不能在節點之間放置線,直到節點被實例化,然後我可以將它們與線關係查詢的結果結合起來。 – 2009-07-09 12:27:32

回答

0

關於2)

使您的模型的第一階段填充異步。 你將有類似的東西


FisrtCall(); 
AsyncResult arPh1 = BeginPhaseOne(); //use results from first call 
SecondCall(); 
EndPhaseOne(arPh1); //wait until phase one is finished 
PhaseTwo(); //proceed to phase two 
 
0

如果你是在.NET 4中,這將是第三方物流的一個理想的應用!你可以因素你的代碼是這樣的任務:

TaskScheduler uiScheduler = GetUISheduller(); 
SqlCommand command1 = CreateCommand1(); 

Task<SqlDataReader> query1 = Task<SqlDataReader>.Factory.FromAsync(command1.BeginExecuteReader, command1.EndExecuteReader, null); 
query1.ContinueWith(t => PopulateGrid1(t.Result), uiScheduler); 

SqlCommand command2 = CreateCommand2(); 
query1.ContinueWith(t => Task<SqlDataReader>.Factory.FromAsync(command2.BeginExecuteReader, command2.EndExecuteReader, null) 
     .ContinueWith(t => PopulateGrid2(t.Result), uiScheduler);