【问题标题】:Dealing with async function doing sync work处理做同步工作的异步函数
【发布时间】:2021-11-07 03:41:18
【问题描述】:

所以我有一个接口,它定义了一些函数,包括这个

Task DoWork();

问题是一些实现这个接口的类不需要异步工作,所以我目前的解决方案是在做一些同步工作后返回Task.CompletedTask

问题是:我是不是用错了方法,我觉得让异步函数做同步工作有点不对

【问题讨论】:

  • 严格来说,这很好。它不会引起任何问题。它只会成为您实现的可读性和首选约定的问题。
  • 错误处理略有不同,即使您不进行异步工作 (stackoverflow.com/a/56490137/120955),也可能需要使用 async。再说一次,返回 Task.CompletedTask 的性能会稍好一些。所以这里没有一个正确的答案。

标签: c# asynchronous async-await


【解决方案1】:

如果您对接口的使用要求操作是异步友好的,那么没有错。 Task.CompletedTask 作为 C# 语言的一部分提供是有原因的。重要的是要反思它的用法以及您是否真的做错了什么或只是遵守接口定义的合同,您似乎通过提出这个问题来做到这一点。

如果您发现自己在接口实现中经常重复这种模式,那么也许这是一个重新思考架构的机会:为什么您的接口有时会同步运行,有时会异步运行,以及如何更好地设计一个处理具体实现的系统需要以异步方式完成工作,而具体实现则不需要异步运行。

【讨论】:

    【解决方案2】:

    可能感觉不对——甚至可能是错的,但错误不在你这一边。

    如果一个方法被定义为返回一个任务,那么这要么是你实现了该方法的一个特殊情况,在这种特殊情况下不必是异步的......或者只是方法的定义是错误,它不应该返回一个任务。

    这是语义上的挑战。但是您将其实现为 Task.CompletedTask 只是您在这种情况下遵循按照 C# 规范列出的语义。

    通过一个具体的例子,我们可以讨论该方法是否应该返回一个任务......但通常:这种情况会发生。为什么你认为 Task.CompletedTask 存在?

    【讨论】:

    • Task.CompletedTask 存在于不需要做任何工作的情况。
    • 不,Task.CompletedTask 也存在于有工作的情况下,但它可以同步完成,因此不需要等待任务。这可能是这个特定实现(接口的)中的方法可以同步,或者对于没有 io 绑定的代码路径。使用它不需要不做任何工作。我有很多代码可以调用方法,在某些情况下,您会立即返回已完成的任务(而在其他参数下,您可能必须等待结果)。
    • “您为什么认为 Task.CompletedTask 存在?” 我假设这里没有人对引入此 API 背后的设计目标有内部知识。同样,仅仅因为 API 存在,其本身并不是使用它的理由。否则我们每天都会使用ArrayLists 和SecureStrings。
    • " 我假设这里没有人对引入此 API 背后的设计目标有内部了解。" - 除了团队实际上在他们的博客上讨论过它。
    • 可以发一下链接吗?
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多