【问题标题】:Console.WriteLine after async await call.异步等待调用后的 Console.WriteLine。
【发布时间】:2016-09-15 21:09:32
【问题描述】:

我对使用异步调用和 await 完全陌生。我有以下单元测试功能:

    public async static void POSTDataHttpContent(string jsonString, string webAddress)
    {
        HttpClient client = new HttpClient();
        StringContent stringContent = new StringContent(jsonString);
        HttpResponseMessage response = await client.PostAsync(
            webAddress,
            stringContent);

        Console.WriteLine("response is: " + response);
    } 

测试完成且没有错误,但我从未在输出中看到 Console.WriteLine 打印语句 - 我不知道为什么。我一直在环顾四周,听起来我可能需要将其设置为一项任务?有人能指出我正确的方向吗?

【问题讨论】:

  • 您使用的是哪个测试框架?微软自己的还是 NUnit?您可能希望将返回类型更改为 Task
  • 您可能希望将返回类型更改为 Task (不是 void - 如果可以帮助,请不要使用 void 作为返回类型);否则你将无法等待它。另外,将 HttpClient 放在 using 块中。
  • 我用的是微软的。
  • 不要返回 void - 您将丢失所有异常信息 msdn.microsoft.com/en-us/magazine/jj991977.aspx

标签: c# http asynchronous httpclient


【解决方案1】:

由于您已经在等待HttpResponseMessage,一个简单(且一致)的解决方案是返回Task<HttpResponseMessage>

var x = await POSTDataHttpContent("test", "http://api/");

public async Task<HttpResponseMessage> POSTDataHttpContent(
    string jsonString, string webAddress)
{
    using (HttpClient client = new HttpClient())
    {
        StringContent stringContent = new StringContent(jsonString);
        HttpResponseMessage response = await client.PostAsync(
        webAddress,
        stringContent);

        Console.WriteLine("response is: " + response);

        return response;
    }
}

也就是说,您还需要确保您的测试设置正确无误。您无法从同步测试中正确调用异步方法。相反,请将您的测试标记为async 并等待您调用的方法。此外,您的测试方法也必须标记为async Task,因为 MS Test Runner 和其他工具(NCrunch、NUnit)都不能正确处理异步 void 测试方法:

[TestMethod]
public async Task TestAsyncHttpCall()
{
    var x = await POSTDataHttpContent("test", "http://api/");
    Assert.IsTrue(x.IsSuccessStatusCode);
}

【讨论】:

    【解决方案2】:

    我认为在这里为您做的最好的事情是选择 Task 返回类型而不是 void。

    public async Task POSTDataHttpContent(string jsonString, string webAddress)
    {
        using (HttpClient client = new HttpClient())
        {
            StringContent stringContent = new StringContent(jsonString);
            HttpResponseMessage response = await client.PostAsync(
                webAddress,
                stringContent);
    
            // Assert your response may be?
        }           
    }
    

    如果你真的坚持不使用任务(这不是一个好主意):

    public void POSTDataHttpContent(string jsonString, string webAddress)
    {
        var Task = Task<HttpResponseMessage>.Run(async () => {
            using (HttpClient client = new HttpClient())
            {
                StringContent stringContent = new StringContent(jsonString);
                HttpResponseMessage response = await client.PostAsync(
                    webAddress,
                    stringContent);
    
    
                return response;
            }
        });
    
        Task.Wait();
        Assert.IsNotNull(Task.Result);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多