0

こんにちは、REST api を使用したいです。私は次のようなコードを使用します:

namespace test2
{

class Program
{
    static void Main(string[] args)
    {
        TestRest t = new TestRest();
        t.Run();
    }
}

public class TestRest
{
    public TestRest() { }

    public async void Run()
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("https://community-league-of-legends.p.mashape.com/");
        client.DefaultRequestHeaders.Add("X-Mashape-Authorization", "tcsgoutBcXP5Lu5L2jYBOu4qeXehseiH");
        HttpResponseMessage response = await client.GetAsync("api/v1.0/euw/summoner/getSummonerByName/NICK_FROM_GAME");

        JObject response2 = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()) as JObject;

        foreach (KeyValuePair<string, JToken> j in response2)
        {
            Console.WriteLine("Key:{0} Value:{1}", j.Key, j.Value);
        }
    }
}

}

しかし、メソッドを呼び出している間:

await client.getAsync("...

プログラムを終了しています。シンプルなAPIを消費するシンプルなコンソールアプリを助けてください。これを管理できません:(

ありがとう

4

1 に答える 1

4

ここには 2 つの問題があります。

  • 非同期メソッドがありますがvoid、これは、イベント ハンドラーであることが意図されていない限り、ほとんど常に悪い考えです。通常、非同期メソッドは、通常は同期メソッドを記述する場所に戻すTask必要があります。void
  • 実行中のフォアグラウンド スレッドがないため、アプリは終了しています。プロセスがまだ生きている間に応答が返された場合に発生する継続がありますが、プロセスを存続させるものは何もありません。

最も簡単な修正は、同時に両方に対処することです。非同期メソッドを returnTaskにしてから、次を使用します。

static void Main(string[] args)
{
    TestRest t = new TestRest();
    t.Run().Wait();
}

TaskUIスレッドで待機すると基本的にデッドロックが発生するため、WinFormsアプリではこれは非常に悪い考えであることに注意してください。ただし、コンソール アプリには UI スレッドに相当するものがないため、タスクの継続はスレッド プールでスケジュールされます。「メイン」スレッドはブロックされ、非同期メソッドの継続はスレッド プール スレッドで実行されます。メインスレッドが完了するのを待っているタスクを完了しました。

于 2013-10-21T08:36:59.367 に答える