2017-04-05 3 views
1

私はREST APIを消費する小さなプログラムを構築しましたが、データを受け取っていないということは決して終了しません。私はAsyncとwaitコマンドを使うのが初めてだから、何とかそれを間違えたかもしれない。数秒後にデータを取得するスレッドがタイムアウトします。 URL自体は有効ですが、例外もスローされていないようです。残りの消費APIのデッドロック

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Text; 
using System.Threading.Tasks; 

namespace Bot_Application1 
{ 
    [Serializable] 
    public class ConsumeFOAAS 
    { 
     private static HttpClient client = new HttpClient(); 
     private static String message = "empty"; 


     public String GetMessage() 
     { 
      RunAsync().Wait(); 
      return message; 
     } 


     static async Task RunAsync() 
     { 
      client.BaseAddress = new Uri("http://foaas.com/"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain")); 

      try 
      { 
       message = await GetProductAsync("/because/:Insultinator"); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 


     static async Task<String> GetProductAsync(string path) 
     { 
      Debug.WriteLine("Inside GetProductAsync"); 
      String product = "empty"; 
      HttpResponseMessage response = await client.GetAsync(path); //<--This never finishes 
      Debug.WriteLine("Response: " + response); 
      if (response.IsSuccessStatusCode) 
      { 
       product = await response.Content.ReadAsStringAsync(); 
      } 
      return product; 
     } 
    } 
} 
+0

'RunAsyncを())(待ってください;'悪い考えです。 'await RunAsync(); 'を使用してください。 –

答えて

-1

デッドロックはタスクマネージャによって引き起こされる可能性があります。使用してみてください:

RunAsync().ConfigureAwait(false).Wait(); 

説明:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

+0

' RunAsync'を待つのはなぜですか? –

+0

「ちょうど待っています」はコンパイルされません – astef

0

あなたは.Wait()を呼び出すべきではありません。あなたが望むものを達成するための最良の待ち時間は次のとおりです。

public async Task<String> GetMessage() 
{ 
    return await RunAsync(); 
} 

そしてRunAsync機能変更:

static async Task<string> RunAsync() { 

client.BaseAddress = new Uri("http://foaas.com/"); 
client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain")); 

try { 
    return await GetProductAsync("/because/:Insultinator"); 
} catch (Exception e) { 
    Console.WriteLine(e.Message); 
} 

}