【发布时间】:2015-06-15 18:30:42
【问题描述】:
以如下界面为例:
interface IOracle
{
Task<string> GetAnswerAsync(string question);
}
此接口的某些实现可能使用async/await。其他人可能不需要。例如,考虑这个简单的玩具实现。
class SimpleOracle
{
public Dictionary<string, string> Lookup { get; set; }
// Warning CS1998: This async method lacks 'await' operators
// and will run synchonously.
public async Task<string> GetAnswerAsync(string question)
{
string answer = Lookup[question];
return answer;
}
}
编译器警告 CS1998 当然是有道理的。通常的建议是remove the async keyword and use Task.FromResult,但它忽略了一个微妙的问题。如果代码抛出异常怎么办?然后代码转换会改变方法的行为:async 版本会将任何异常包装在Task 中;非async 版本不会,没有明确的try-catch。
保留async 关键字完全符合我的要求,但它会产生编译器警告,我认为禁止这些是不明智的。
我应该如何重构我的方法实现以不产生编译器警告,同时还像任何其他 async 方法一样使用 Task 包装所有异常?
【问题讨论】:
标签: c# .net async-await task-parallel-library