【问题标题】:In C#, what is the difference between methods that return async Task<int> vs. Task<int>? [closed]在 C# 中,返回异步 Task<int> 与 Task<int> 的方法有什么区别? [关闭]
【发布时间】:2021-10-15 08:43:29
【问题描述】:

我是 C# 异步编程的新手。一般来说,我了解异步编程的概念,但我并不完全了解所有细节,所以我得到了这个问题。

这两种方法的概念区别是什么?

        public async Task<int> Action1()
        {
          // ...
        }

        public Task<int> Action2()
        {
          // ...
        }

当我在代码中看到它们时,我应该如何考虑它们?例如。我应该想到什么心理模型? 在哪些用例中我应该使用一个而不是另一个(如果有任何偏好)?

编辑: 这段代码有意义吗:

    public async Task Action1()
    {
      await someAsyncMethod(); // do nothing with result
    }

    public Task Action2()
    {
      return Action1()
    }

【问题讨论】:

  • 您只能在标记为异步的方法中使用 await。
  • 这个问题真的不是很好,你真正的问题是真正询问关键字“异步”的含义,以及如何“思考”它以及使用什么心理模型的所有部分真的很有主见。
  • 你可能会觉得这很有趣:Eliding Async and Await
  • 这能回答你的问题吗? How and when to use ‘async’ and ‘await’

标签: c# asynchronous .net-core async-await


【解决方案1】:

我喜欢这样思考:

换句话说,async 影响方法的实现方式,但不是方法签名的一部分。

以你为例,the signatures appear in the IL:

.method public hidebysig 
    instance class [System.Private.CoreLib]System.Threading.Tasks.Task`1<int32> Action1 () cil managed 

.method public hidebysig 
    instance class [System.Private.CoreLib]System.Threading.Tasks.Task`1<int32> Action2 () cil managed 

关于何时使用async(用于方法实现),我的快速经验法则是当我正在编写的方法需要调用并等待另一个返回Task 的方法时使用异步。换句话说,当我需要在一个方法的实现中使用await

不过,其他几个问题/答案比我能更好地解决这个问题:

【讨论】:

  • 感谢您的全面回答,但您能否解决我感兴趣的一个重要问题。拥有返回 Task 而之前没有 async 的方法是否有意义?例如。在我的原始帖子中,我使用了第二种方法:public Task&lt;int&gt; Action2() { ... },并且这种方法内部没有await。特别是在 ASP.NET Core 操作或剃须刀页面中这样做是否有意义?
  • 我已将我的 OP 更新为 Action2,调用 Action1 来表明我的意思。
  • drakelambert.dev/2020/07/…。这样做肯定是有原因的,但你需要仔细考虑这意味着什么。
【解决方案2】:

不同之处在于,如果您不使用保留字“async”向方法指定它将是异步的,那么您将无法进行异步调用。即使您指示任务。 如果您尝试创建一个方法,并且在内部表示等待,但在方法的原型设计中您没有表示异步,那么它将表明您有错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多