2016-11-03 11 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が完了してから、結果が私の残りの呼び出しから戻ってくる前に完了します。

この場合、スレッドを正しく使用するにはどうすればよいですか?

私のasyncメソッドの呼び出し方法。

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

暗闇の中を迷う代わりに、async/awaitのチュートリアルを読んでください。 –

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

また、あなたの方法は、次の文で、あなたのRESTサービス呼び出しの結果を受け取るためにTask<Dictionary<string, string>>を返すことを定義する必要があります。

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

ない場合は、この質問Is .GetAwaiter().GetResult(); safe for general use?最良の選択肢があまりにも非同期(async)あなたの呼び出し元のコードを作ることですので、それは、いくつかの問題を引き起こす可能性がで説明したようGetAwaiter().GetResult()を使用してますが同じように、いくつかの回避策を見ています。

+1

最初に、あなたは可能な出現を隠しています。第二に、もう一つの疑問は「非同期void *」だけです。同期してブロックする場合は、戻り値に '.Result'を呼び出すことができます –

+0

良い点!私はリンクがまったく同じシナリオではないことに気づいた。 'GetAwaiter()。GetResult()'の回避策は、コンソールアプリケーションでのみ使用されることはめったにありません。 – jorgonor

関連する問題