如何将这种方法转换为异步

时间:2019-09-24 17:30:17

标签: c#

我有一个简单的方法,如下所示。如何将其转换为异步?

public string Smethod0(HttpWebRequest httpWebRequest0)
{
    return new StreamReader(Smethod_1(httpWebRequest0).GetResponseStream(),
        Encoding.UTF8, true).ReadToEnd();
}

2 个答案:

答案 0 :(得分:2)

您可以使用异步/等待机制使其异步:

public async Task<string> Smethod0(HttpWebRequest httpWebRequest0)
    {
        return await new StreamReader(Smethod_1(httpWebRequest0).GetResponseStream(),
        Encoding.UTF8, true).ReadToEndAsync();
    }

还请参见我正在使用ReadToEndAsync()代替ReadToEnd()。

史蒂夫是对的,您必须先处置流,然后再返回结果。

答案 1 :(得分:0)

它始终取决于方法,但是在这种情况下,您已经有了返回异步结果的好方法,甚至没有使方法本身async

public Task<string> Smethod0(HttpWebRequest httpWebRequest0)
{
    return new StreamReader(Smethod_1(httpWebRequest0).GetResponseStream(),
        Encoding.UTF8, true).ReadToEndAsync();
}

asyncawait添加到该方法将毫无意义,因为该方法本身不需要实际await进行任何操作。这样做只会增加无用的等待时间。

如果您想在技术上更加正确,则还应该处置您的阅读器。您可以像这样改善您的原始实现:

public async Task<string> Smethod0(HttpWebRequest httpWebRequest0)
{
    using (StreamReader reader = new StreamReader(
        Smethod_1(httpWebRequest0).GetResponseStream(), Encoding.UTF8, true))
    {
        return await reader.ReadToEndAsync();
    }
}

请注意,在这种情况下,有一个 指向等待结果的原因,因为您不希望在完成处理后就丢弃读取器。