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

时间:2016-06-26 17:33:19

标签: 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);
    }
}

在上面的示例中,异步操作由client.GetStringAsync(url)表示,我只是将消费者的Task<string>返回给awaitclient中的using会发生什么情况?是否会在等待或垃圾回收之前进行清理,还是会导致其他问题?

在这样的async语句的原因中使用awaitusing会更好吗,如果是这样,为什么?

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 个答案:

答案 0 :(得分:7)

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

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