C# PostAsync永远不会在控制台应用程序中返回

C# PostAsync永远不会在控制台应用程序中返回,c#,httpclient,C#,Httpclient,我试图实现一个简单的XMLHTTPPOST接口,但不知怎么的,它停止了工作。这是我的代码: HttpClient _httpClient = new HttpClient(); static void Main(string[] args) { Login("", ""); } public async void Login(string username, string password)

我试图实现一个简单的XMLHTTPPOST接口,但不知怎么的,它停止了工作。这是我的代码:

    HttpClient _httpClient = new HttpClient();

    static void Main(string[] args)
    {
        Login("", "");
    }

    public async void Login(string username, string password)
    {
        var response = await SendXml("<foo>");
    }

    public async Task<string> SendXml(string xml)
    {
        var content = new StringContent(xml);
        var response = await _httpClient.PostAsync("http://127.0.0.1:8080/Path", content);
        var responseBody = await response.Content.ReadAsStringAsync();

        return responseBody;
    }
HttpClient\u HttpClient=new HttpClient();
静态void Main(字符串[]参数)
{
登录(“,”);
}
公共异步无效登录(字符串用户名、字符串密码)
{
var response=wait SendXml(“”);
}
公共异步任务SendXml(字符串xml)
{
var content=新的StringContent(xml);
var response=wait_httpClient.PostAsync(“http://127.0.0.1:8080/Path“,内容);
var responseBody=await response.Content.ReadAsStringAsync();
返回响应体;
}
我觉得很简单,但在运行时,它只会在
PostAsync
处停止。当我在
ReadAsStringAsync
上放置断点时,它从未被命中

我没有例外,没有错误,什么都没有。我的服务器显示“发送数据时连接中止”


我一定是做错了什么,但我找不到。。。我必须说,
等待
的东西仍然让我有点困惑。此代码是一个控制台应用程序,异步/等待是否会导致此处出现问题?

当您使用基于任务的操作时,需要使应用程序一直异步到应用程序的入口点,通常是
Program.Main()

如果使用C#>=7.1,则可以使用

名称空间MyApp
{
公共课程
{
私有只读静态HttpClient _HttpClient=新HttpClient();
公共异步静态任务Main()
{
var response=await SendXml(“myxml”);
}
公共异步静态任务SendXml(字符串xml)
{
var content=新的StringContent(xml);
var response=wait_httpClient.PostAsync(“http://127.0.0.1:8080/Path“,内容);
var responseBody=await response.Content.ReadAsStringAsync();
返回响应体;
}
}
}
如果您使用的是旧版本,则不支持异步入口点,但您可以编写:

namespace MyApp
{
    public class Program
    {
        private readonly static HttpClient _httpClient = new HttpClient();
        
        public static void Main()
        {
            try
            {
                MainAsync().GetAwaiter().GetResult();
            }
            catch (System.Exception)
            {
                // TODO: log unhandled exception
                throw;
            }
        }

        private static Task MainAsync()
        {
            var response = await SendXml("myxml");
        }

        public async static Task<string> SendXml(string xml)
        {
            var content = new StringContent(xml);
            var response = await _httpClient.PostAsync("http://127.0.0.1:8080/Path", content);
            var responseBody = await response.Content.ReadAsStringAsync();

            return responseBody;
        }
    }
}
名称空间MyApp
{
公共课程
{
私有只读静态HttpClient _HttpClient=新HttpClient();
公共静态void Main()
{
尝试
{
MainAsync().GetAwaiter().GetResult();
}
捕获(系统异常)
{
//TODO:日志未处理的异常
投掷;
}
}
专用静态任务MainAsync()
{
var response=await SendXml(“myxml”);
}
公共异步静态任务SendXml(字符串xml)
{
var content=新的StringContent(xml);
var response=wait_httpClient.PostAsync(“http://127.0.0.1:8080/Path“,内容);
var responseBody=await response.Content.ReadAsStringAsync();
返回响应体;
}
}
}

在最后一种情况下,请确保只有一个调用
GetAwaiter().GetResult()
的点,而不是其他任何地方,因为这可能会导致死锁。

Async/await不是问题的原因。您是否尝试指定超时?您是否正在调用调用代码中的任何位置的Task.Result?@Silvermind这可能不是原因,但当我删除它并使用
.Result
,它工作正常…不要使用
.Result
,因为这可能会导致死锁。您使用的是
[StaThread]
?@Silvermind控制台应用程序是否会在收到结果之前结束?我该怎么等呢?在
catch(Exception){throw;}
中没有任何意义,因为如果你只是重新播放它,它就等于根本不捕捉。@ckuri我知道。我特意把它放在那里,作为这次行动的指南。
namespace MyApp
{
    public class Program
    {
        private readonly static HttpClient _httpClient = new HttpClient();
        
        public static void Main()
        {
            try
            {
                MainAsync().GetAwaiter().GetResult();
            }
            catch (System.Exception)
            {
                // TODO: log unhandled exception
                throw;
            }
        }

        private static Task MainAsync()
        {
            var response = await SendXml("myxml");
        }

        public async static Task<string> SendXml(string xml)
        {
            var content = new StringContent(xml);
            var response = await _httpClient.PostAsync("http://127.0.0.1:8080/Path", content);
            var responseBody = await response.Content.ReadAsStringAsync();

            return responseBody;
        }
    }
}