c# – 在方法签名中添加异步是一个重大改变吗?
在解决关于使用异步/等待多少的问题时,即“所有方法应该返回任务吗?”,this answer的作者MatíasFidemraizer声称,即使你的方法目前只做同步的东西,它仍然应该返回一个任务因此,如果你以后再做异步操作,“你可以把它变成实际的异步操作,而不会影响整个代码库”.这是有道理的,但如果我实际上在等待某些东西,我必须在方法签名中添加异步.所以我们谈论的是:
public Task WhateverAsync() { return Task.FromResult(true); } 至 public async Task WhateverAsync() { return await AwaitableSomething(); } 将async添加到方法签名是一个重大改变吗? 解决方法
我不同意.如果您的方法是同步的,那么它应该具有同步API.如果您的方法是异步的,那么它应该有一个异步API. 但是,我同意,如果同步方法在接口/基类中定义,并且未来的实现/覆盖可能需要使用等待,那么同步方法应具有返回任务的签名.
只是添加异步?不它不是.考虑在接口中定义的任务返回方法的情况:它可以使用或不使用异步来实现. 但是,正如我在博客中描述的那样,有一些可能的differences in semantics.最值得注意的是异常处理是不同的.如果你不小心,一个天真的同步实现可能会直接抛出异常,而不是返回一个错误的任务.只要将该方法设置为异步,异常就会导致任务错误,并且不再直接抛出. 所以,这真的是一个关于语义可能发生变化的问题.我认为天真的同步语义是错误的,因为该方法具有异步签名.例如,同步方法具有异步签名,因此调用者认为它将捕获异常并返回故障任务是合理的.因此,如果同步实现具有这些(易于导致的)错误,那么在技术上添加异步将是一个重大变化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |