c# - 将异步添加到方法签名是一项重大更改吗?

标签 c# .net asynchronous async-await

在解决关于使用多少 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/

相关文章:

c# - 反转数组中的元素

c# - 如何使这个函数在恒定时间内处理?

c# - Excel 互操作 : Quitting the Excel application instance makes my tests fail?

android - BufferedReader 读取在线文本文件而不在文件中缓存文本?

C# - 特定 int 值在数组中出现了多少次?没有 Linq 技术

c# - 如何在我的项目中引用 TeamFoundation 程序集?

java - 连续暂停/停止和启动/恢复Java TimerTask?

javascript - DynamoDB API Node ,是否可以同步获取结果?

c# - 如何在 UWP 的 Pivot 中获取 Pivot.ItemTemplate 中的控件?

.net - Windows Phone 嵌入式 8 DeviceCapability PointofService 导致部署错误