2016-06-20 3 views
0

사용자 응답 클래스를 작성하는 몇 가지 함수가 있으며 TASK 비동기 호출을 여전히 파악하고 있습니다.함수를 병렬로 여러 호출을 실행하는 방법

아래 코드에서 한 번에 하나씩 모두를 모두 병렬로 실행할 수있는 방법이 있습니까?

내 첫 번째 질문은 전화가 지금 설정되는 방식과 어떻게 일치해야할까요?

두 번째 질문은 어떻게 이러한 모든 호출을 병렬로 실행할 수 있습니까? 수익은 어떻게 호출이 발생 지금 설정되는 방식을 취하고있다 특정 순서

public static async Task<ProjectForDrawings> GetProjectInfo(string cnn, int projectID) 
    { 

     return await Task.Run(() => 
     { 
      ProjectForDrawings projectForDrawings = DataBase.proc_GetProject_ForDrawings.ToRecord<ProjectForDrawings>(cnn, projectID); 

      projectForDrawings.Submittals = DataBase.proc_GetSubmittal.ToList(cnn, projectID); 

      projectForDrawings.ProjectLeafs = DataBase.proc_GetProjectLeafs.ToList<ProjectLeaf>(cnn, projectID); 

      projectForDrawings.Revisions = DataBase.proc_GetRevisionsForProject.ToList<Revisions>(cnn, projectID); 

      return projectForDrawings; 
     }); 
    } 

답변

1

에 반환 할

필요는 없다? 가 완료 될 때까지

이 일정 후 백그라운드 스레드 (Task.Run)과의 작업은 비동기 (await) 기다립니다. 작업은 각 데이터베이스 proc를 한 번에 하나씩 실행하고 완료 될 때까지 백그라운드 스레드를 동기식으로 차단합니다.

이러한 모든 호출을 어떻게 병렬로 실행할 수 있습니까? Task.WhenAll

당신은 모든 작업을 시작할 수 있습니다

다음 await 모두 :

public static async Task<ProjectForDrawings> GetProjectInfo(string cnn, int projectID) 
{ 
    ProjectForDrawings projectForDrawings = DataBase.proc_GetProject_ForDrawings.ToRecord<ProjectForDrawings>(cnn, projectID); 

    var submittalsTask = Task.Run(() => DataBase.proc_GetSubmittal.ToList(cnn, projectID)); 
    var leafsTask = Task.Run(() => DataBase.proc_GetProjectLeafs.ToList<ProjectLeaf>(cnn, projectID)); 
    var revisionsTask = Task.Run(() => DataBase.proc_GetRevisionsForProject.ToList<Revisions>(cnn, projectID)); 

    await Task.WhenAll(submittalsTask, leafsTask, revisionsTask); 

    projectForDrawings.Submittals = await submittalsTask; 
    projectForDrawings.ProjectLeafs = await leafsTask; 
    projectForDrawings.Revisions = await revisionsTask; 
    return projectForDrawings; 
} 

그러나, 많은 (? 대부분)는 데이터베이스 연결에 여러 쿼리를 허용하지 않는 데이터베이스, 그래서 이것은 수도 데이터베이스에서 작동하지 않습니다. 또한 처음부터 데이터베이스에서 호출을 병렬 처리하는 것은 좋지 않을 수 있습니다. 서비스 자체 거부를 야기 할 수 있습니다. 마지막으로 using Task.Run in the implementation is not a good pattern (블로그에서 설명하는 이유로) - 자연적인 비동기 메서드를 사용하면 더 좋을 것입니다.

+0

대단히 감사합니다. –

+0

이 문서에서는 SQL Server의 경우 2005 년까지 연결 풀이 있고 호출자가 동일한 연결에서 db에 호출하면 사용 가능한 연결 중 하나를 잡고 사용합니다. 연결이 열려 있지 않으면 호출자에게 선택할 수있는 사용 가능한 연결이 끊어집니다. 이것은 여기에 단지 느슨한 이야기이며, 나는 이것을 정확하게 이해하고 있습니까? –

+0

@ AlumCloud.Com : 그것은'DataBase' 메소드가 어떻게 구현되는지에 달려 있습니다. 그들 모두가 독립적 인'DbConnection'을 사용한다면, 그것은 작동 할 것입니다. 그들 모두가 같은'DbConnection' 인스턴스를 사용하고 있다면 예외가 나타날 것입니다. –

관련 문제