Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C HttpClient-PostAsync不返回(即使使用ConfigureAwait)_C#_Wpf_Async Await_Httpclient_Blocking - Fatal编程技术网

C# C HttpClient-PostAsync不返回(即使使用ConfigureAwait)

C# C HttpClient-PostAsync不返回(即使使用ConfigureAwait),c#,wpf,async-await,httpclient,blocking,C#,Wpf,Async Await,Httpclient,Blocking,在C中使用HttpClient,我快疯了 我简化了我的项目,这样我的问题可以更容易地复制。我只想在后台调用HttpClient.PostAsync,而不阻塞我的UI窗口。顺便说一句,我正在使用WPF 这是我的代码将代码精简到最小值: Bing在这里只是用来不显示我的私人网站服务,它当然可以被其他网站取代 private async void Window_Loaded(object sender, RoutedEventArgs e) { try {

在C中使用HttpClient,我快疯了

我简化了我的项目,这样我的问题可以更容易地复制。我只想在后台调用HttpClient.PostAsync,而不阻塞我的UI窗口。顺便说一句,我正在使用WPF

这是我的代码将代码精简到最小值: Bing在这里只是用来不显示我的私人网站服务,它当然可以被其他网站取代

    private async void Window_Loaded(object sender, RoutedEventArgs e)
    {
        try {
            MyTextBlock.Text = "Waiting...";

            Uri webUri = new Uri("https://www.bing.com/");
            using (HttpClient client = new HttpClient()) {
                using (HttpResponseMessage response = await client.PostAsync(webUri, new MultipartFormDataContent())) {
                    MyTextBlock.Text = await response.Content.ReadAsStringAsync();                       
                }
            }
        } catch (Exception exc) {
            MessageBox.Show(exc.ToString(), "Unhandled Exception");
        }
    }
当我的UI正在等待异步post请求时,它在文本框中显示等待。当异步请求返回时,它会显示结果。不应该再发生什么了

所以问题出现了,有时PostAsync方法根本不返回。。。即使超时也会被忽略。当我调试时,它总是工作,但当我尝试启动应用程序时,它有时会挂起。不总是这样,这并不会使查找错误变得更容易。我尝试了很多方法来异步调用请求,但每次都遇到同样的问题

我还阅读了下面的博客,其中提到异步方法中的阻塞问题,但即使使用configurewait,也没有什么不同。

我可以想象HttpClient异步方法中存在锁定主线程的问题,因此它导致了这个问题。Wenn我在控制台应用程序中使用相同的代码,一切正常。在我的客户机和目的地之间有一个代理,但这不应该是一个问题

有人能复制这个问题吗?我在.NET Framework 4.6.1中使用C/WPF。

您不需要等待client.PostAsyncwebUri,我是formData,因为在调用返回后,您不需要对结果执行任何操作,您只需返回任务即可。改变这一点

public static Task<HttpResponseMessage> BasicRequest(MultipartFormDataContent i_formData)
{
    Uri webUri = new Uri("https://www.bing.com");

    HttpClient client = new HttpClient {
        Timeout = TimeSpan.FromSeconds(1)
    };
    return client.PostAsync(webUri, i_formData);
}
您不需要等待client.PostAsyncwebUri,i_formData,因为在调用返回后,您不需要对结果执行任何操作,只需返回任务即可。改变这一点

public static Task<HttpResponseMessage> BasicRequest(MultipartFormDataContent i_formData)
{
    Uri webUri = new Uri("https://www.bing.com");

    HttpClient client = new HttpClient {
        Timeout = TimeSpan.FromSeconds(1)
    };
    return client.PostAsync(webUri, i_formData);
}

首先谢谢你的帮助,这个问题现在似乎已经解决了

为了得到这份工作,我必须做三件事:

获取一个HttpClient实例,在整个应用程序生命周期中使用它,这样就不再使用HttpClient了

不要在窗口加载的事件中调用PostAsync,有时似乎太早了。我还是不明白为什么

不要使用ConfigureWaitFalse

代码现在看起来像这样:

HttpClient client = new HttpClient();

private async void MyButton_Click(object sender, RoutedEventArgs e)
{
    try {
        MyTextBlock.Text = "Waiting...";
        Uri webUri = new Uri("https://www.bing.com/");
        using (HttpResponseMessage response = await client.PostAsync(webUri, new ipartFormDataContent())) {
            MyTextBlock.Text = await response.Content.ReadAsStringAsync();
        }
    } catch (Exception exc) {
        MessageBox.Show(exc.ToString(), "Unhandled Exception");
    }
}
为了在创业时做到这一点,我必须做一件非常糟糕的好事。但它最终起作用了:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    DispatcherTimer startupTimer = new DispatcherTimer();
    startupTimer.Tick += new EventHandler((o, a) => {
        MyFunction();
        startupTimer.Stop();
    });
    startupTimer.Interval = TimeSpan.FromSeconds(1);
    startupTimer.Start();
}
当有人可以复制这些行为或解释这些行为发生的原因时,请在此处进行评论:

更新


问题仍然存在,但它似乎只有在客户端使用某种代理时才会出现

首先谢谢你的帮助,这个问题现在似乎已经解决了

为了得到这份工作,我必须做三件事:

获取一个HttpClient实例,在整个应用程序生命周期中使用它,这样就不再使用HttpClient了

不要在窗口加载的事件中调用PostAsync,有时似乎太早了。我还是不明白为什么

不要使用ConfigureWaitFalse

代码现在看起来像这样:

HttpClient client = new HttpClient();

private async void MyButton_Click(object sender, RoutedEventArgs e)
{
    try {
        MyTextBlock.Text = "Waiting...";
        Uri webUri = new Uri("https://www.bing.com/");
        using (HttpResponseMessage response = await client.PostAsync(webUri, new ipartFormDataContent())) {
            MyTextBlock.Text = await response.Content.ReadAsStringAsync();
        }
    } catch (Exception exc) {
        MessageBox.Show(exc.ToString(), "Unhandled Exception");
    }
}
为了在创业时做到这一点,我必须做一件非常糟糕的好事。但它最终起作用了:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    DispatcherTimer startupTimer = new DispatcherTimer();
    startupTimer.Tick += new EventHandler((o, a) => {
        MyFunction();
        startupTimer.Stop();
    });
    startupTimer.Interval = TimeSpan.FromSeconds(1);
    startupTimer.Start();
}
当有人可以复制这些行为或解释这些行为发生的原因时,请在此处进行评论:

更新


问题仍然存在,但它似乎只有在客户端使用某种代理时才会出现

为什么要在对Task.Run的调用中包装一个异步调用,而您甚至不等待它?您可以删除Task.Run并使Window_加载一个异步方法吗?它不需要返回任务,因为它是一个事件处理程序。那么您也就不需要Dispatcher了。@PeterBons:因为我不想在UI线程中等待请求。用户界面应该一直运行。或者您的解决方案是什么???@Momo使用async/await允许您使UI响应,而无需创建新线程,因此如果您只是在没有任务的情况下等待它。运行它将不会阻止您的UI。使用ConfigureAwait确定任务是否应返回到原始线程。在大多数情况下,它将是错误的,但是在UI和web上下文中,它应该是正确的。为什么要在对Task.Run的调用中包装一个异步调用,而您甚至都不等待它?您可以删除Task.Run并使Window_加载一个异步方法吗?它不需要返回任务,因为它是一个事件处理程序。那么您也就不需要Dispatcher了。@PeterBons:因为我不想在UI线程中等待请求。用户界面应该一直运行。或者您的解决方案是什么???@Momo使用async/await允许您使UI响应,而无需创建新线程,因此如果您只是在没有任务的情况下等待它。运行它将不会阻止您的UI。使用ConfigureAwait确定任务是否应返回到原始线程。在大多数情况下,它是错误的,但是在UI和web上下文中,它应该是真实的谢谢你的回答,这是一个很好的提示。它会把好东西粘下来。但不幸的是,它并没有解决我的问题:愚蠢的问题,但你是p吗
登录bing.com?:D刚用不太私密的东西替换了我的私人网络服务器:D不希望每个人都坐在我的网络服务器上。但是逻辑是一样的,所以我选择了bing:好吧,是的,这是有道理的。我以为你在尝试访问bing.com,他们可能会有一些限制或其他什么。您是否尝试过在try catch中包装窗口加载代码?你可能会得到一些AggregateException是的,当然,我试过了,即使是AppDomain.CurrentDomain.UnhandledException。但这里出现的唯一异常是几分钟后我得到一个线程被取消的异常。但我没有发现真正的问题。我已经在考虑网络问题了。。但是,难道不应该提高暂停时间吗?谢谢你的回答,这是一个很好的提示。它会把好东西粘下来。但不幸的是,这并不能解决我的问题:愚蠢的问题,但你是在bing.com上发帖吗?:D只是用一些不太私密的东西替换了我的私人网络服务器:D不希望所有人都坐在我的网络服务器上。但是逻辑是一样的,所以我选择了bing:好吧,是的,这是有道理的。我以为你在尝试访问bing.com,他们可能会有一些限制或其他什么。您是否尝试过在try catch中包装窗口加载代码?你可能会得到一些AggregateException是的,当然,我试过了,即使是AppDomain.CurrentDomain.UnhandledException。但这里出现的唯一异常是几分钟后我得到一个线程被取消的异常。但我没有发现真正的问题。我已经在考虑网络问题了。。但是,难道不应该提高暂停时间吗?