【问题标题】:C# Task returning method in using block使用块中的C#任务返回方法
【发布时间】:2016-06-26 17:33:18
【问题描述】:

C# 中,当从 using 语句中返回 TaskTask<T> 方法时,是否存在清理不正确的风险,或者这是一种不好的做法?在using 块中关闭变量有什么问题?

考虑以下几点:

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

在上面的示例中,异步操作由client.GetStringAsync(url) 表示,我只是将消费者的Task&lt;string&gt; 返回到awaitclientusing 中会发生什么情况 - 它在等待或垃圾收集之前被清理,还是会导致其他问题?

在这样的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);
    }
}

有什么区别?

【问题讨论】:

    标签: c# multithreading asynchronous async-await


    【解决方案1】:

    使用第一种方法不行,client会在它完成工作之前被处理掉,你必须使用第2或第3版本。

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

    【讨论】:

    • "Will not work" 有点误导......它绝对不正确,但如果任务的结果恰好是,它会在技术上“工作”同步提供,这使得这种类型的错误难以测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多