我对C_很陌生。我正在使用await关键字调用httpclient的api。
static async Task<HttpResponseMessage> CreateChannel(string channelName)
{
try
{
HttpClient client = new HttpClient();
var req = new
{
id= channelName
};
StringContent content = new StringContent(JsonConvert.SerializeObject(req).ToString(), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync("http://localhost:3000/channel", content);
response.EnsureSuccessStatusCode();
return response;
}
catch (Exception ex)
{
...
var view = new Dialog();
...
var result = await DialogHost.Show(view);
return null;
}
}
private void initSocketIo(string channel)
{
CreateChannel(channel).Wait();
...
// after this method we init UI etc.
}
我有两个问题似乎无法解决
在client.postasync()方法运行之后,我的应用程序就崩溃了。就这么简单。我理解这是因为主线程没有其他东西要处理,但是上面的所有代码都发生在
MainWindow
的构造函数代码中,所以在await
之后还有很多事情要做。从未触发异常。如何确保在
client.PostAsync()
中调用异常catch子句引发异常。任何代码建议只要有效就行了:)。
最佳答案
您将阻塞调用(.Result
,.Wait()
)与异步调用混合,这可能导致死锁。
使initSocketTo
异步。
private async Task initSocketIo(string channel) {
var response = await CreateChannel(channel);
...
// after this method we init UI etc.
}
也不要尝试在构造函数中执行异步。在生命周期的后期移动较重的进程。您甚至可以引发一个事件并在另一个线程上处理它,以免阻塞流。
关于c# - C#HttpClient.PostAsync并等待崩溃的应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46133061/