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

这里有两个问题:

  • 你有一个void异步方法,这几乎总是一个坏主意,除非它是一个事件处理程序。您通常应该Task在通常编写void同步方法的地方返回异步方法。
  • 您的应用程序正在退出,因为没有运行的前台线程。如果在进程仍然存在的情况下返回响应,则会触发一个延续- 但没有任何东西可以让进程保持活跃。

最简单的解决方法是同时解决这两个问题 - 只需让异步方法 return Task,然后使用:

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

请注意,在 WinForms 应用程序中这将是一个非常糟糕的主意,因为Task在 UI 线程中等待基本上会导致死锁。但是,在控制台应用程序中,没有等效的 UI 线程,因此在线程池上安排任务延续 - 您的“主”线程将阻塞,异步方法中的延续将在线程池线程上运行,然后当完成了主线程正在等待的任务将完成。

于 2013-10-21T08:36:59.367 回答