2013-03-15 1 views
2

RestSharp 구현시 다음과 같은 문제가 있습니다. 계속하기 전에 내 신청서가 ExecuteAsync()의 응답을 기다리게하려면 어떻게해야합니까?ExecuteAsync() 결과 기다림

내가 노력 다른 솔루션 :

먼저 (이 방법은 ExecuteAsync 응답을 기다리지 않습니다는) :

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

그래서 나는이 시도하지만, 응용 프로그램이 정지 :

public Task<Connection> Connect(string userId, string password) 
    { 
     EventWaitHandle executedCallBack = new AutoResetEvent(false); 
     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)); 
       executedCallBack.Set(); 
       }); 
     executedCallBack.WaitOne(); 
     return tcs.Task; 
    } 
+0

무엇이'RestClient'입니까? – Default

+1

'RestSharp' 라이브러리,'WebClient'의 일종입니다. – user2169047

+0

what 's Connection? RestSharp에서이 클래스를 찾을 수 없습니다. – adrian4aes

답변

3

나는 Task와 async/await 패턴의 요점을 놓치고 있다고 생각한다.

이 메서드는 기다리지 않고 Task<>을 반환하므로 호출자가 선택하면 비동기 적으로 기다릴 수 있습니다.

호출 측은이 같은 것입니다 :

public async void ButtonClick(object sender, RoutedEventArgs args) 
{ 
    Connection result = await restClient.Connect(this.UserId.Text, this.Password.Text); 

     //... do something with result 
} 

컴파일러는 동기 (차단) 상당와 매우 유사하다이 코드를 만들고, 비동기 코드로를 설정하는 방법을 알고 있습니다.

asyncawait 키워드에 주목하고 Task<Connection>Connection으로 바뀌 었음을 알 수 있습니다.

첫 번째 코드 스 니펫이 정상적으로 보입니다.

두 번째 스레드는 다른 스레드 메커니즘 (즉, 세마포어 AutoResetEvent)을 도입 할 때 문제를 일으킬 수 있습니다. 또한 @HaspEmulator가 맞습니다. UI 스레드에 있으면 WP 앱을 교착 상태로 만드는 것으로 알려져 있습니다.

+0

해결책 주셔서 감사합니다.하지만 여전히 동일한 문제가 있습니다. 방법 '공공 작업 연결 (문자열 사용자 ID, 문자열 암호) {...} 'client.ExecuteAsync 의 실행을 (대기 tcs.task'without' 반환'.. .) ' 결과가 항상 null입니다. – user2169047

+1

네, 정확하게해야 할 일입니다. 당신이 '기다리는'경우에만 결과를 얻을 것입니다. –

0

WebRequest를 수행하는 동안 (다른 라이브러리를 통해 직접 또는 간접적으로) 차단하면 안됩니다. 교착 상태 인 것 같습니다. 이것을 피하십시오.