返回Task与使用await的疑问:为何DoItTask()方法无法运行?
关于async/await与直接返回Task的疑问
我遵循“非必要时不使用await”的指导(注:涉及using { ... }语句时必须使用await),但以下代码中的DoItTask()无法正常工作,是不是只有方法内没有使用await时,才能直接返回Task而不使用await?
private static async Task<string> ReadOne() { return await readerOne.ReadAsync(); } private static async Task<string> ReadTwo() { return await readerTwo.ReadAsync(); } private static async Task<string> ReadThree() { return await readerOne.ReadAsync(); } private static async Task<string> ReadCombinedAsync(string one, string two, string three) { return await reader.CombineAsync(one, two, three); } private static Task<string> ReadCombinedTask(string one, string two, string three) { return reader.CombineAsync(one, two, three); } private static async Task<string> DoItAwait() { string one = await ReadOne(); string two = await ReadOne(); string three = await ReadOne(); return await ReadCombinedAsync(one, two, three); } private static Task<string> DoItTask() { string one = await ReadOne(); string two = await ReadOne(); string three = await ReadOne(); return ReadCombinedAsync(one, two, three); }
问题分析
DoItTask()无法正常工作的核心原因是方法体内使用了await关键字,但没有标记async修饰符——这是C#的语法强制要求:只要方法中存在await操作,就必须给方法加上async修饰符,无论最终是否直接返回Task。
正确规则说明
- 无await操作时:可以直接返回Task,无需
async修饰,比如示例中的ReadCombinedTask()就是正确用法,这样能避免async方法带来的状态机额外开销。 - 有await操作时:必须给方法加上
async修饰符,但最后一步如果是返回Task,可以选择去掉await直接返回(比如 DoItAwait()的最后一行可以改成return ReadCombinedAsync(one, two, three);),这依然符合“非必要不使用await”的指导,同时满足语法要求。
DoItTask()的修正写法
// 保留async,最后直接返回Task,符合指导 private static async Task<string> DoItTask() { string one = await ReadOne(); string two = await ReadOne(); string three = await ReadOne(); return ReadCombinedAsync(one, two, three); }
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

