C#HttpClient.PostAsync和wait崩溃应用程序
我对C#很陌生。我使用wait关键字来调用HttpClient的APIC#HttpClient.PostAsync和wait崩溃应用程序,c#,.net,wpf,http,dotnet-httpclient,C#,.net,Wpf,Http,Dotnet Httpclient,我对C#很陌生。我使用wait关键字来调用HttpClient的API static async Task<HttpResponseMessage> CreateChannel(string channelName) { try { HttpClient client = new HttpClient(); var req = new { id= channelName };
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.
}
静态异步任务CreateChannel(字符串channelName)
{
尝试
{
HttpClient=新的HttpClient();
var req=新
{
id=通道名称
};
StringContent=newStringContent(JsonConvert.SerializeObject(req.ToString(),Encoding.UTF8,“application/json”);
HttpResponseMessage响应=等待客户端。PostAsync(“http://localhost:3000/channel“,内容);
response.EnsureSuccessStatusCode();
返回响应;
}
捕获(例外情况除外)
{
...
var view=新建对话框();
...
var result=wait DialogHost.Show(视图);
返回null;
}
}
私有void initSocketIo(字符串通道)
{
CreateChannel(channel.Wait();
...
//在这个方法之后,我们初始化UI等。
}
我有两个问题似乎无法解决
main窗口的构造函数代码中,因此在wait
client.PostAsync()
中调用我的exception catch子句引发异常任何代码建议只要可行:) 您将阻塞调用(
.Result
,.Wait()
)与异步调用混合在一起,这可能导致死锁
使initSocketTo
async
private async Task initSocketIo(string channel) {
var response = await CreateChannel(channel);
...
// after this method we init UI etc.
}
也不要尝试在构造函数中执行异步。在生命周期的后期移动较重的流程。您甚至可以在另一个线程上引发事件并处理该事件,以免阻塞流。您将阻塞调用(
.Result
,.Wait()
)与异步调用混合在一起,这可能导致死锁
使initSocketTo
async
private async Task initSocketIo(string channel) {
var response = await CreateChannel(channel);
...
// after this method we init UI etc.
}
也不要尝试在构造函数中执行异步。在生命周期的后期移动较重的流程。您甚至可以在另一个线程上引发事件并处理该事件,以免阻塞流。您将阻塞调用(
.Result
,.Wait()
)与异步调用混合在一起,这可能导致死锁。使initSocketTo
async。也不要尝试在构造函数中执行异步。。。我能说什么呢。我问自己做错了什么,结果被否决了。如果你想帮忙,请张贴正确的方法。正如我提到的,如果我将异步添加到initSocketIo
中,这是我第一次尝试C#@Nkosi,这是一样的。从我的观点来看,我只是希望应用程序不要崩溃并捕获HTTP异常。我没有投票否决这篇文章。向initSocket添加async不会使其成为异步的。您需要使该方法返回任务
,然后添加异步,然后在另一个异步方法上使用等待
。我知道这有点旧,但我也有同样的症状。我发现我的应用程序实际上在另一个线程上发生了堆栈溢出(这迫使应用程序消失)。时间的安排让它看起来像是邮递同步,因为它需要时间。我通过在应用程序运行时对其进行桌面视频捕获发现了这一点。您将阻塞调用(.Result
,.Wait()
)与异步调用混合在一起,这可能导致死锁。使initSocketTo
async。也不要尝试在构造函数中执行异步。。。我能说什么呢。我问自己做错了什么,结果被否决了。如果你想帮忙,请张贴正确的方法。正如我提到的,如果我将异步添加到initSocketIo
中,这是我第一次尝试C#@Nkosi,这是一样的。从我的观点来看,我只是希望应用程序不要崩溃并捕获HTTP异常。我没有投票否决这篇文章。向initSocket添加async不会使其成为异步的。您需要使该方法返回任务
,然后添加异步,然后在另一个异步方法上使用等待
。我知道这有点旧,但我也有同样的症状。我发现我的应用程序实际上在另一个线程上发生了堆栈溢出(这迫使应用程序消失)。时间的安排让它看起来像是邮递同步,因为它需要时间。我通过在应用程序运行时对其进行桌面视频捕获来解决这个问题。