在using块中返回C#任务的方法

12
在C#中,在using语句内返回TaskTask<T>方法时,是否存在清理不正确的风险?这是一种不好的实践吗?在涉及using块中变量的闭包时有哪些问题需要考虑?
考虑以下内容:
public Task<string> GetAsync(string url)
{
    using (var client = new HttpClient())
    {
        return client.GetStringAsync(url);
    }
}

在上面的示例中,异步操作由 client.GetStringAsync(url) 表示,我只是返回该 Task<string> 给使用者进行 await。当 clientusing 中时会发生什么 - 它会在等待或垃圾回收之前被清理吗?还是会导致其他问题?

如果这样做,在 using 语句中使用 asyncawait 是否更好,为什么?

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

或者

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

有什么区别吗?

1个回答

16

使用第一种方法是行不通的,client 在完成工作之前就被销毁了,你必须使用第二种或第三种方法。

第二种和第三种版本之间没有实际区别,选择适合你团队风格的即可。但在第二种版本中,string response = string.Empty; 可以简化为 string response; 如果所有代码路径都会在不读取该变量的情况下覆盖它,则没有理由为变量赋值。


2
“不会工作”有点误导人……它绝对不是正确的,但如果任务的结果恰好同步可用,它在技术上将“工作”,这使得这种类型的错误难以测试。 - JoelFan

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