在解决关于使用多少 async/await 的问题时,即“所有方法都应该返回 Task
吗?”,this answer 的作者, Matías Fidemraizer 声称,即使你的方法目前只做同步的事情,它仍然应该返回一个任务,所以如果你让它稍后做异步的事情,“你可以把它变成实际的异步操作而不影响整个代码库”。这是有道理的,但如果我真的在等待某些东西,我必须将 async
添加到方法签名中。所以我们谈论的是从:
public Task WhateverAsync()
{
return Task.FromResult(true);
}
到
public async Task WhateverAsync()
{
return await AwaitableSomething();
}
将 async
添加到方法签名是否是重大更改?
最佳答案
even if your method currently only does synchronous stuff, it should still return a task
我不同意。如果您的方法是同步的,那么它应该有一个同步 API。如果您的方法是异步的,那么它应该有一个异步 API。
但是,我同意同步方法应该有一个Task
-返回签名如果它们是在接口(interface)/基类和中定义的 future 的实现/覆盖很可能需要使用 await
。
Is adding async to a method signature a breaking change?
只是添加async
?不它不是。考虑在接口(interface)中定义的 Task
返回方法的情况:它可以使用或不使用 async
来实现。
但是,有一些可能differences in semantics ,正如我在我的博客上描述的那样。最值得注意的是异常处理不同。如果您不小心,天真的同步实现可能会直接抛出异常,而不是返回错误的任务。一旦您使该方法async
,异常就会导致任务出错,并且不再直接抛出。
所以,这实际上是一个关于语义可能变化的问题。我认为天真的同步语义是错误的,因为该方法具有异步签名。例如,同步方法具有异步签名,因此调用者可以合理地假设它会捕获异常并返回错误任务。因此,如果同步实现有这些(容易引起的)错误,那么添加 async
在技术上将是一个重大变化。
关于c# - 将异步添加到方法签名是一项重大更改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44395899/