程序在调用await函数时退出

问题描述 投票:0回答:1

我想使用 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,但我无法管理这个:(

c# .net asp.net-web-api async-await
1个回答
4
投票

这里有两个问题:

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

,然后使用:


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

请注意,这在 WinForms 应用程序中是一个非常糟糕的主意,因为在 UI 线程中等待 
Task

基本上会导致死锁。但是,在控制台应用程序中,没有与 UI 线程等效的线程,因此任务延续是在线程池上安排的 - 您的“主”线程将阻塞,异步方法中的延续将在线程池线程上运行,然后当完成主线程正在等待的任务将完成。

    

© www.soinside.com 2019 - 2024. All rights reserved.