2009-06-16 2 views
2

처음부터 WinForms 클라이언트에서 비동기 작업을 사용하고 있지만 일부 작업에서만 비동기 작업을 사용했습니다. ExecuteReader 또는 ExecuteNonQuery이 완료되면 콜백 위임이 실행되고 모든 것이 올바르게 작동합니다.여러 비동기 SqlClient 작업 - 좋은 예제 찾기

나는 기본적으로 두 가지 문제를 가지고 :

1) 실제 시스템이 처리에 가장 적합한 구조는 무엇입니까? 내가 본 모든 예제는 폼이 작업 완료를 처리 한 다음 EndExecuteReader에있는 데이터 아더를 여는 장난감 예제입니다. 물론 이것은 양식이 평상시처럼 데이터베이스와 밀접하게 결합되어 있음을 의미합니다. 그리고 물론이 양식은 항상 .Invoke으로 쉽게 전화 할 수 있습니다. AsyncCtrlBlock<T> 클래스에서 상속받을 모든 비동기 개체를 설정하고 내 DAL에서 비동기 개체의 생성자에 제공되는 모든 콜백 대리자와 양식을 갖습니다.

2) 현재 비동기 적이 지 않은 프로그램의 일부를 다시 방문 할 예정입니다. 그것은 두 번의 전화를 연속적으로합니다. 첫 번째 작업이 완료되면 모델의 일부가 채워집니다. 두 번째 작업이 완료되면 모델의 나머지 부분을 완료 할 수 있지만 첫 번째 부분이 이미 완료된 경우에만 완료됩니다. 이것을 구조화하는 가장 좋은 방법은 무엇입니까? 첫 번째 읽기가 완료되고 두 번째 읽기가 시작되는 동안 첫 번째 읽기로 인해 처리가 진행되는 것은 좋지만 두 번째 읽기의 처리가 시작되기를 원하지 않을 때까지 시작해야합니다. 첫 번째 읽기의 데이터가 완료되었습니다.

+0

는 "그것은 좋은 것입니다,하지만 난 싶지 않은 :이 같은 작업에 코드를 반영 할 수 첫 번째 읽기의 데이터 처리가 완료되었음을 알 때까지 두 번째 읽기의 처리가 시작됩니다. " 첫 번째와 두 번째가 동시에 실행을 시작해야한다는 것을 의미합니까?하지만 첫 번째 완료 전에 두 번째 완료를 원하지 않습니까? –

+0

첫 번째 완료 이벤트 처리가 완료 될 때까지 두 번째 완료 이벤트 처리를 시작합니다. 즉, 첫 번째 쿼리는 노드 집합을 가져오고 두 번째 쿼리는 행 집합을 가져옵니다. 노드가 인스턴스화 될 때까지 노드 사이에 선을 놓을 수 없습니다. 그런 다음 선 관계 쿼리의 결과와 조인 할 수 있습니다. –

+0

CTE, Common Table Expressions (http://msdn.microsoft.com/en-us/library/ms190766.aspx 참조)가 한 단계에서 결과를 얻을 수 있다고 설명합니다. WITH의 내부에서 첫 번째 쿼리를 정의하고 WITH 다음에 JOIN 문에서 두 번째 쿼리의 노드를 사용합니다. 그렇지 않습니까? – Oleg

답변

0

2)

비동기로 채워지는 모델을 만듭니다. 당신이

당신이 닷넷 4에있는 경우

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

현상금을 얻으려면 양식의 이벤트를 처리하지 않는 실제 예제 코드 또는 양식에 대한 링크를보고 싶습니다. 2) 두 가지 요청을 대기열에 넣는 방법을 보여줍니다. 첫 번째 요청이 완료되고 처리 된 후에 만 ​​초를 처리합니다 (두 번째 요청이 여전히 보류 중일 때도 첫 번째 요청 결과가 처리됨) –

0

뭔가를해야합니다 ,이 TPL의 이상적인 응용 프로그램이 될 것입니다! 첫 번째 읽기 수행 및 처리에 의한 첫 번째 읽기 두 번째가 시작되는 동안 진행 될 수있는 경우

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);