最初,我创建了一个控制台应用程序来做一些从服务器获取api调用的测试,并获得了完整的功能和工作。现在,我想要做一个显示,但是来自控制台应用程序的相同代码将不能在winforms应用程序中运行。由于一些断点测试,我发现它在这一行挂起了:
var response = await httpClient.SendAsync(request);
我不明白有什么不同,我已经下载了所有需要的包。我认为这与使用await有关。谢谢你,伊森
以下是不包含私有信息的请求方法代码。我意识到最后有一些不必要的组件,但我只是简单地从我最初的测试控制台应用程序复制和粘贴。所有使用此方法的方法,包括main,都是异步的。
public async Task<string> APICall(string address)
{
string error = "An error was encountered.";
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), address))
{
request.Headers.TryAddWithoutValidation("Api-Key", "API KEY");
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/hal+json"));
var response = await httpClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
try
{
Stream res = await response.Content.ReadAsStreamAsync();
var serializer = new JsonSerializer();
using (var sr = new StreamReader(res))
{
using (var jsonTextReader = new JsonTextReader(sr))
{
return await response.Content.ReadAsStringAsync();
}
}
}
catch (IOException e)
{
Console.WriteLine(e);
}
catch (NullReferenceException e)
{
Console.WriteLine(e);
}
}
request.Dispose();
}
httpClient.Dispose();
}
return error;
}
这些是调用问题方法的方法,它从Main到startAsync,再到CallAsync,再到APICall,也就是有问题的方法。
static async Task Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 f = new Form1();
Caller caller = new Caller();
string test = await caller.CallAsync();
foreach (KeyValuePair<string, Server> server in Server.servers)
{
f.AddRow(server.Value.name, server.Value.location, server.Value.status, server.Value.ticketStatus);
}
Application.Run(f);
}
public static async Task startAsync()
{
Caller caller = new Caller();
string json = await caller.CallAsync();
Console.WriteLine(json);
dynamic name = JsonConvert.DeserializeObject<RootObject>(json);
List<Location> locs = name._embedded.locations;
int count = 0;
foreach (Location loc in locs)
{
count++;
Console.WriteLine(count);
Server.servers.Add(loc.name, new Server(loc.name, loc.address.city, loc.address.state, loc.id, loc.status, await caller.TicketStatusAsync(loc.id)));
}
}
public async Task<string> CallAsync()
{
return await APICall(baseAddress);
}
https://stackoverflow.com/questions/56213682
复制相似问题