例如,考虑以下界面:
一些此接口的实现可能使用
编译器警告CS1998是有道理的。通常的建议是 删除
保留
如何重构我的方法实现,以避免产生编译器警告,并像任何其他
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是有道理的。通常的建议是 删除
async
关键字并使用 Task.FromResult
, 但它忽略了一个微妙的问题。如果代码抛出异常会怎么样?那么该代码转换将更改方法的行为: async
版本将在 Task
中包装任何异常;而非 async
版本则不会,除非使用显式的 try
-catch
。保留
async
关键字可以完全按照我的意愿工作,但它会产生一个编译器警告,我认为抑制这些警告是不明智的。如何重构我的方法实现,以避免产生编译器警告,并像任何其他
async
方法一样在 Task
中包装所有异常?
Task.RunSynchronously
。我个人更喜欢它,而不是TaskCompletionSource
方法。 - noseratio - open to work