程序在调用await函数时退出

时间:2013-10-21 08:31:49

标签: .net api asp.net-web-api async-await


您好,我想使用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,我无法管理:(

由于

1 个答案:

答案 0 :(得分:4)

这里有两个问题:

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

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

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

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