在async await调用之后使用Console.WriteLine。

7

我完全不了解使用异步调用和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打印语句显示在输出中——我不确定为什么。我一直在寻找答案,听起来好像我需要将其设置为任务?有人能指导我正确的方向吗?


3
你使用的是哪个测试框架?是微软自己的还是 NUnit?你可能想将返回类型更改为 Task - Swagata Prateek
2
你可能想将返回类型更改为Task(而不是void-如果可以的话,请尽量不要使用void作为返回类型),否则无法进行等待。另外,请将HttpClient放在using块中。 - EJoshuaS - Stand with Ukraine
2
我正在使用微软的。 - Roka545
不要返回“void” - 这样会丢失所有异常信息。https://msdn.microsoft.com/en-us/magazine/jj991977.aspx - Scott Perham
2个回答

6

如果您已经等待一个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);
}

3
我认为在这种情况下,您最好选择返回 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接