2013-03-15 6 views
2

이 메서드를 호출하면 아무 일도 일어나지 않고 응용 프로그램이 충돌합니다. 내 생각에 그게 ExecuteAsync method.can 누군가 나를 도울 것 같아?. 이건 내 코드입니다.값을 비동기 메서드로 반환하는 방법?

코드 1 :

public Task<Connection> Connect(string userId, string password) 
    { 
     var client = new RestClient(_baseUrl) 
      { 
       Authenticator = new SimpleAuthenticator("user", userId, 
        "password", password) 
      }; 
     var tcs = new TaskCompletionSource<Connection>(); 
     var request = new RestRequest(AppResources.Authenticating); 
     client.ExecuteAsync<Connection>(request, response => tcs.SetResult(new 
       JsonDeserializer().Deserialize<Connection>(response))); 
     return tcs.Task; 
    } 

나는이 코드를 시도했지만 여전히 같은 문제가 존재한다.

CODE2는 :

public async Task<Connection> Connect(string userId, string password) 
    { 
     var client = new RestClient(_baseUrl) 
      { 
       Authenticator = new SimpleAuthenticator("user", userId, 
         "password", password) 
      }; 
     var tcs = new TaskCompletionSource<Connection>(); 
     var request = new RestRequest(AppResources.Authenticating); 
     client.ExecuteAsync<Connection>(request, response => tcs.SetResult(new 
       JsonDeserializer().Deserialize<Connection>(response))); 
     Debug.WriteLine(tcs.Task.Result.Data); 
     return await tcs.Task; 
    } 
+2

'충돌'이란 무엇입니까? 오류 메시지를 줄 수 있습니까? 스택 추적? –

+0

아무것도 추가되지 않고 응용 프로그램이 정지하고 – user2169047

+0

에 응답하지 않습니다. 어떤 줄에서 멈 춥니 까? 귀하의 서비스가 전화를 받았음을 확인 했습니까? –

답변

2

당신은 비동기 코드에 Task.Result 또는 Task.Wait을 사용하지 않습니다. 이 멤버는 작업 병렬 라이브러리 (병렬 코드 작성)의 일부로 Task을 사용할 때만 사용됩니다. 비동기 코드에서는 거의 사용하지 않아야합니다.

고객님의 경우 TaskResult (이)가 Connect (또는 아마도 호출 스택을 더 올려서)으로 전화 한 것으로 의심됩니다. 이것은 나의 블로그에서 설명하는 것처럼 cause a deadlock 일 수있다.

초보자를위한 비동기 코드와 관련하여 @LasseVKarlsen에 동의하지 않습니다. 제 생각에는 새로운 async/await 언어 기능이 있다는 것을 배워야한다는 것을 절대적으로 생각합니다.

my introduction으로 시작하여 MSDN docsTAP pattern으로 연락하는 것이 좋습니다. 그런 다음 가장 일반적인 함정을 피하려면 내 best practices article을 검토하십시오.

관련 문제