我想使用 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,但我无法管理这个:(
这里有两个问题:
void
异步方法,这几乎总是一个坏主意,除非它是一个事件处理程序。通常,您应该让异步方法返回 Task
,而您通常会在其中编写 void
同步方法。Task
,然后使用:
static void Main(string[] args)
{
TestRest t = new TestRest();
t.Run().Wait();
}
请注意,这在 WinForms 应用程序中是一个非常糟糕的主意,因为在 UI 线程中等待
Task
基本上会导致死锁。但是,在控制台应用程序中,没有与 UI 线程等效的线程,因此任务延续是在线程池上安排的 - 您的“主”线程将阻塞,异步方法中的延续将在线程池线程上运行,然后当完成主线程正在等待的任务将完成。