C#HttpClient.PostAsync和wait崩溃应用程序

C#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 };

我对C#很陌生。我使用wait关键字来调用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.
}
静态异步任务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等。
}
我有两个问题似乎无法解决

  • 在client.PostAsync()方法运行后,我的应用程序就崩溃了。就这么简单。我理解这是因为主线程没有任何其他要处理的东西,但是上面所有的代码都发生在
    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不会使其成为异步的。您需要使该方法返回
    任务
    ,然后添加异步,然后在另一个异步方法上使用
    等待
    。我知道这有点旧,但我也有同样的症状。我发现我的应用程序实际上在另一个线程上发生了堆栈溢出(这迫使应用程序消失)。时间的安排让它看起来像是邮递同步,因为它需要时间。我通过在应用程序运行时对其进行桌面视频捕获来解决这个问题。