使用块的C#任务返回方法

Dav*_*ine 6 c# multithreading asynchronous async-await

C#中,当一个Task或一个Task<T>方法从一个using语句中返回时,是否有任何不正确发生清理的风险,或者这是一个不好的做法?有什么问题,因为它涉及到using块中变量的关闭?

考虑以下:

public Task<string> GetAsync(string url)
{
    using (var client = new HttpClient())
    {
        return client.GetStringAsync(url);
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,异步操作由client.GetStringAsync(url),我只是Task<string>为消费者返回await.client它在a中发生了什么?它在using等待或垃圾收集之前是否被清理干净,还是会导致其他问题?

使用asyncawait在这样的using陈述的原因是否更好,如果是这样,为什么?

public async Task<string> GetAsync(string url)
{
    string response = string.Empty;
    using (var client = new HttpClient())
    {
        response = await client.GetStringAsync(url);
    }
    return response;
}
Run Code Online (Sandbox Code Playgroud)

要么

public async Task<string> GetAsync(string url)
{
    using (var client = new HttpClient())
    {
        return await client.GetStringAsync(url);
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么不同?

Sco*_*ain 10

使用第一种方法不起作用,client在完成其工作之前将被处理,您必须使用第二或第三版.

第2版​​和第3版之间没有实际差异,请根据您团队的风格使用.但是在第二个版本string response = string.Empty;中可以简化为string response;如果所有代码路径都覆盖它而不读取它,则没有理由为变量赋值.

  • “不会工作”有点误导......它绝对不是*正确*,但从技术上讲,如果任务的结果恰好同步可用,它就会“工作”,这使得这种类型的错误难以测试为了。 (2认同)