2014-11-12 5 views
3

Xamarin.Forms를 사용하여 개발 된 기존 iOS 응용 프로그램이 있습니다. 이제 Android 및 Windows Phone으로 확장하고자합니다. 기존 응용 프로그램에서는 모든 웹 서비스 호출이 동 기적으로 수행됩니다. Windows phone은 비동기 호출 만 지원하므로 비동기 호출을 동기식으로 래핑하는 것이 좋습니다.Windows Phone 8에서 비동기 메서드를 동 기적으로 호출하는 방법

우리는 HttpClient.PostAsync 메서드를 사용하여 서비스에 액세스합니다. 실행이 PostAsync 메서드에 도달하면 전화가 끊깁니다. 다음과 같이 서비스를 호출하는 코드는 다음과 같습니다

private static async void CallService(System.Uri uri) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     client.DefaultRequestHeaders.Host = uri.Host; 
     client.Timeout = System.TimeSpan.FromSeconds(30); 
     HttpContent content = new StringContent("", Encoding.UTF8, "application/xml"); 

     var configuredClient = client.PostAsync(uri, content).ConfigureAwait(false); 
     var resp = configuredClient.GetAwaiter().GetResult(); 
     resp.EnsureSuccessStatusCode(); 
     responseString = resp.StatusCode.ToString(); 
     resp.Dispose(); 

     client.CancelPendingRequests(); 
     client.Dispose(); 
    } 
} 

그래서 단지 내가 (false)를 ConfigureAwait를 구현,이 때문에 UI 스레드를 차단 알고 있지만 전혀 작동하지 않았다. 나는 System.Net.WebClient도 시도했지만 같은 결과를 보였다.

이제 Windows Phone 8에서이 비동기 호출을 동 기적으로 처리하도록 만드는 방법은 무엇입니까?

+0

당신이해야 할 일은 컨텍스트 (스레드 풀)에서 실행되는 다음 줄로 이어질 수있는'.ConfigureAwait (false)'를 삭제하는 것입니다. http://msdn.microsoft.com/en-us/magazine/jj991977.aspx – MickyD

답변

5

먼저 완벽하게 완료 될 때까지 기다릴 수 없으므로 비동기 무효 메서드를 사용하지 마십시오. Task 대신 async 방법을 사용하면 Task을 반환하기 위해 특별한 조치를 취할 필요가 없습니다. 컴파일러가 모든 작업을 처리합니다.

HttpClient.PostAsync에 대한 호출을 기다려야합니다. UI가 응답을 유지하기에 충분해야합니다.

private static async Task CallService(System.Uri uri) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     client.DefaultRequestHeaders.Host = uri.Host; 
     client.Timeout = System.TimeSpan.FromSeconds(30); 
     HttpContent content = new StringContent("", Encoding.UTF8, "application/xml"); 

     var resp = await client.PostAsync(uri, content);// Await it 
     resp.EnsureSuccessStatusCode(); 
     responseString = resp.StatusCode.ToString(); 
     resp.Dispose(); 

     client.CancelPendingRequests(); 
    } 
} 

참고 : 필요하지 않으므로 ConfigureAwait(false)을 삭제했습니다. 정말로 필요한 경우 다시 추가 할 수 있습니다.

+1

클라이언트를 '사용하고있는 경우'마지막에 처리 할 필요가 없습니다. 사용 블록은 자동으로 종료. – GalacticCowboy

+0

@ GalacticCowboy 당신이 맞습니다, 업데이트되었습니다, 감사합니다. 방금 관련 부분을 작업했습니다. OP의 모든 코드를 휴식하십시오. –

+0

메소드 헤더에'async Task'없이 빌드 할 것이라고 생각하지 마십시오. – Alex

관련 문제