2016-07-14 4 views
2

Entity Framework는 저장 프로 시저를 DbContext 클래스의 메서드로 가져옵니다. 그러나 비동기식이 아니므로 스레드를 차단하지 않고도 비동기식 WebApi 컨트롤러에서 호출 할 수 있기를 원합니다. 비동기 래퍼 메서드를 작성했지만 Visual Studio에서 제공하는 경고로 혼란 스럽습니다.동기 코드 비동기 실행

이 코드는 비동기 적으로 실행됩니까?

public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId) 
    { 
     await Task.Run(() => 
     { 
      //synchronous method generated by EF. 
      //VS warning here 
      AttachTypeToMeetingTime(meetingTimeId, meetingTypeId); 
     }); 
    } 

비주얼 스튜디오 나에게 경고를 준다 : 나는 제안을 따른다면 통화가 그러나

을 완료되기 전에이 호출이 기다리고 있지 않기 때문에

을, 현재의 thread의 실행은 계속 그리고 빨간색으로 밑줄이 그어지고 컴파일되지 않을 것입니다.

통화가 완료되기 전에 현재 스레드를 계속하고 싶지 않습니까?

+0

사이드 노트 : 나는 당신이 당신이 실제로만을 수행하려고하면 성능 저하 이해를 바랍니다 - 대신 당신은 지금 다른 스레드 풀 스레드로 작업을 이동하고 컨텍스트 스위치/스레드를 지불 요청을 처리하는 스레드에서 하나의 스레드가있는의 동기화 (또한 그 스레드 또한 culture/Current 요청으로 설정되지 않으며 나중에 모든 종류의 재미를 줄 것입니다) –

+0

@AlexeiLevenkov 미안 해요. 해결 섹션을 자체 답변으로 이동했습니다. 어떻게 내가 비동기 컨트롤러 메소드 및/또는'FindAsync()'와 같은 바닐라 EF 비동기 메소드와 다른 일을하고 있는가? –

+0

True 비동기 메서드는 스레드에서 대기 중 대기를 수행하지 않습니다 (동기 한 번과 달리). 일반적으로 [동기 메서드에 대한 비동기 래퍼를 공개해야합니까?] (http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx)와 같은 비동기를 읽는 것이 좋습니다. 출발점. –

답변

4

재귀 호출을하고 있습니다. 네가 그렇게하려고 한 것 같지 않아.

AttachTypeToMeetingTime 대신 사용자가 말한 것과 같은 동기식 메서드를 호출해야합니다.

public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId) 
{ 
    await Task.Run(() => 
    { 
     SomeMethod(meetingTimeId, meetingTypeId); 
     ^^^^^ 
    }); 
} 
+0

재귀를 잘 잡으려면 – BradleyDotNET

+0

이 오타였습니다. 잡는 것에 감사드립니다. 나는 그 질문을 편집했다. –

1

메서드 이름을 잘못 호출했습니다. 생성 된 메소드의 서명이 내 메소드의 매개 변수 int 있었다 때문에 생성 된 메소드의 매개 변수는 서명이 충돌하지 않을 int? 것을 알았는데

AttachTypeToMeetingTime(int? meetingTimeId,int? meetingTypeId) 

public async Task AttachTypeToMeetingTimeAsync(int meetingTimeId,int meetingTypeId) 
    { 
     await Task.Run(() => 
     { 
      //synchronous method generated by EF. 
      //VS warning here 
      AttachTypeToMeetingTime(meetingTimeId, meetingTypeId); 
     }); 
    } 

했지만, I : 그것은해야한다 짐작하면 비주얼 스튜디오의 추천 엔진과 어쩌면 컴파일러.

0

아래 코드에서 "Your"로 시작하는 항목을 채우십시오.

public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId) 
{ 
    using(var context = new YourContext()) 
    { 
     await conext.Database.ExecuteSqlCommandAsync("YourStoredProcedureName @YourParam1Name, @YourParam2Name", meetingTimeId, meetingTypeId); 
    } 
} 
관련 문제