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