처음부터 WinForms 클라이언트에서 비동기 작업을 사용하고 있지만 일부 작업에서만 비동기 작업을 사용했습니다. ExecuteReader
또는 ExecuteNonQuery
이 완료되면 콜백 위임이 실행되고 모든 것이 올바르게 작동합니다.여러 비동기 SqlClient 작업 - 좋은 예제 찾기
나는 기본적으로 두 가지 문제를 가지고 :
1) 실제 시스템이 처리에 가장 적합한 구조는 무엇입니까? 내가 본 모든 예제는 폼이 작업 완료를 처리 한 다음 EndExecuteReader
에있는 데이터 아더를 여는 장난감 예제입니다. 물론 이것은 양식이 평상시처럼 데이터베이스와 밀접하게 결합되어 있음을 의미합니다. 그리고 물론이 양식은 항상 .Invoke
으로 쉽게 전화 할 수 있습니다. AsyncCtrlBlock<T>
클래스에서 상속받을 모든 비동기 개체를 설정하고 내 DAL에서 비동기 개체의 생성자에 제공되는 모든 콜백 대리자와 양식을 갖습니다.
2) 현재 비동기 적이 지 않은 프로그램의 일부를 다시 방문 할 예정입니다. 그것은 두 번의 전화를 연속적으로합니다. 첫 번째 작업이 완료되면 모델의 일부가 채워집니다. 두 번째 작업이 완료되면 모델의 나머지 부분을 완료 할 수 있지만 첫 번째 부분이 이미 완료된 경우에만 완료됩니다. 이것을 구조화하는 가장 좋은 방법은 무엇입니까? 첫 번째 읽기가 완료되고 두 번째 읽기가 시작되는 동안 첫 번째 읽기로 인해 처리가 진행되는 것은 좋지만 두 번째 읽기의 처리가 시작되기를 원하지 않을 때까지 시작해야합니다. 첫 번째 읽기의 데이터가 완료되었습니다.
는 "그것은 좋은 것입니다,하지만 난 싶지 않은 :이 같은 작업에 코드를 반영 할 수 첫 번째 읽기의 데이터 처리가 완료되었음을 알 때까지 두 번째 읽기의 처리가 시작됩니다. " 첫 번째와 두 번째가 동시에 실행을 시작해야한다는 것을 의미합니까?하지만 첫 번째 완료 전에 두 번째 완료를 원하지 않습니까? –
첫 번째 완료 이벤트 처리가 완료 될 때까지 두 번째 완료 이벤트 처리를 시작합니다. 즉, 첫 번째 쿼리는 노드 집합을 가져오고 두 번째 쿼리는 행 집합을 가져옵니다. 노드가 인스턴스화 될 때까지 노드 사이에 선을 놓을 수 없습니다. 그런 다음 선 관계 쿼리의 결과와 조인 할 수 있습니다. –
CTE, Common Table Expressions (http://msdn.microsoft.com/en-us/library/ms190766.aspx 참조)가 한 단계에서 결과를 얻을 수 있다고 설명합니다. WITH의 내부에서 첫 번째 쿼리를 정의하고 WITH 다음에 JOIN 문에서 두 번째 쿼리의 노드를 사용합니다. 그렇지 않습니까? – Oleg