2016-11-03 13 views
-4

.NET의 스레딩에 익숙하지 않습니다. 나는 결과 (사전)을 얻을 수있는 방법을 호출로 실행하고비동기 메서드를 호출하는 방법?

public async Task MyTest() { 
    using (HttpClient httpClient = new HttpClient()) { 
     httpClient.BaseAddress = new Uri(_uri); 

     var response = await httpClient.GetAsync("API/GetData"); 

     if(response!=null && response.IsSuccessStatusCode) { 
      var json = await response.Content.ReadAsStringAsync(); 
      return JsonConvert.DeserializeObject<Dictionary<string, string>>(json); 
     } 
    } 
} 

문제 :

가 나는 ansync 방법 MYTEST 있습니다.

내 코드를 살펴보면 결과가 내 휴식 전화에서 돌아 오기 전에 IsCompleted가 완료되었음을 확인할 수 있습니다.

이 경우 어떻게 제대로 스레드를 사용합니까?

비동기 메서드를 호출하는 내 메서드입니다.

public void GetTestData() 
{ 
    try 
    {     
     ARestService rest = new ARestService(); 
     Task tsk = new Task(rest.MyTest); 
     if (tsk.IsCompleted) 
     { 
      var tst = "Done?"; 
     } 
    } 
    catch(Exception ex) 
    { 
     string a = ex.Message; 
    } 
} 
+0

어둠 속을 헤매는 대신 비동기식/대기식에 대한 자습서를 읽어보십시오. –

+1

가능한 [C#에서 동기 메서드에서 비동기 메서드를 호출하는 방법?] (http://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method-in-c) – meJustAndrew

+0

그냥 호출하고 결과를 기다리고 있습니다. 아니면 직접 기다려야합니다. 이 메서드는 ** 비동기입니다. ** ReadAsStringAsync **는 이미 비동기이며 백그라운드에서 실행됩니다. 이 메소드는 당신이 기다려야 만하는 이미 실행중인 태스크를 리턴한다. –

답변

0

당신이 async 방법으로 GetTestData 방법을 설정할 수 있습니다 경우 단순히이 작업을 수행.

public async Task GetTestData() 
{ 
    try 
    {     
     ARestService rest = new ARestService(); 
     await rest.MyTest(); 
     var tst = "Done?"; 
    } 
    catch(Exception ex) 
    { 
     string a = ex.Message; 
    } 
} 

당신은 또한 당신의 방법은 다음과 같은 문으로, 당신의 휴식 서비스 호출의 결과를받을 Task<Dictionary<string, string>>을 반환 정의해야합니다.

Dictionary<string, string> dict = await rest.MyTest(); 

그렇지 않은 경우는, GetAwaiter().GetResult()를 사용하여 같은 몇 가지 해결 방법을 살펴 가지고 있지만 그것은 몇 가지 문제가 발생할 수 있습니다이 질문에 Is .GetAwaiter().GetResult(); safe for general use? 설명, 그래서 최선의 선택은 너무 비동기 당신의 호출 코드를 확인하는 것입니다.

+1

먼저, 가능한 exepctions 숨어 있습니다. 둘째, 다른 질문은 '비동기 무효'*에 관한 것입니다. 동 기적으로 블록하려는 경우 반환 값에'.Result'를 호출하면됩니다. –

+0

좋은 점! 나는 링크가 정확히 같은 시나리오가 아니라는 것을 깨달았다. 나는 거의 콘솔 응용 프로그램에서만'GetAwaiter(). GetResult()'대안을 사용하지 못했습니다. – jorgonor

관련 문제