c# - 与异步/等待 C# 作斗争

标签 c# .net asynchronous async-await

<分区>

我看了很多async/await的内容,但是对下面的情况还是有些不理解。

我的问题是,我应该像在 DoSomething() 中那样实现我的“包装器”方法,还是像在 DoSomethingAsync() 中一样。

那么什么更好(以及为什么):我是在包装器方法中使用 await 还是直接返回任务?

        public static async void Main()
        {
            await DoSomething();
            await DoSomethingAsync();
        }

        private static Task DoSomething()
        {
            return MyLibrary.DoSomethingAsync();
        }

        private static async Task DoSomethingAsync()
        {
            await MyLibrary.DoSomethingAsync().ConfigureAwait(false);
        }

        public class MyLibrary
        {
            public static async Task DoSomethingAsync()
            {
                // Here is some I/O
            }
        }

最佳答案

Async/Await 仍然相对较新,但有一些好的做法可以帮助阐明 API。基础是这样的:

  • 一个声明自己为async的方法意味着它期待 await稍后
  • async隐式创建一个 Task为你。
  • await就像一个书签。应用程序从使用 await 关键字的地方恢复。
  • 你不能await任何不是 IAwaitable 的东西(最常见的是 Task )( citation )

在一个既有异步调用又有同步调用的应用中,我们采用了一种命名约定:

  • async调用返回 TaskTask<T>并附加单词 Async到名字的末尾。
  • 同步调用(默认)就像任何方法一样工作,没有特殊约定。

通常,可以有两种方法做同样的事情,但一种是同步的,另一种不是。您可以通过两种不同的方式实现它,也可以将一种方式与另一种方式包装在一起。这实际上取决于您的需求以及什么可以为您提供响应速度更快的应用程序。

在上面的例子中,处理异步和普通方法调用的正确方法是 MyLibrary公开两种方法。这个例子是这样的:

 public static class MyLibrary
 {
     public static void DoSomething()
     {
         // do some work
     }

     public static async Task DoSomethingAsync()
     {
         // do similar work but use async API,
         // can also simply call DoSomething().
     }
 }

 // In another part of code would be called like this:
 public static async Task BiggerMethod()
 {
     MyLibrary.DoSomething();
     await MyLibrary.DoSomethingAsync();
 }

你要避免的是包装一个 async方法与常规方法。一旦您使用 Task直接,您将失去所有 async 的好处和 await并且您介绍了您的代码可能发生死锁的地方。

关于c# - 与异步/等待 C# 作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35433333/

相关文章:

c# - 如何在 Nhibernate 中定义一个 CHAR (ORACLE) 列?

c# - .NET 4 中的多线程改进

ssl - erlang:接收来自 ssl 的响应

node.js - s3.putObject() 在监听 httpDownloadProgress 事件时阻塞服务器

c# - 角色认证与授权

c# - 什么时候调用重写的方法中的base.Method(),团队写代码时如何标记?

c# - 将带有 JsonPropertyName 装饰的 POCO 对象转换为 URL 查询字符串

jquery - 同步jquery $.ajax而不锁定IE?

c# - 为 Canvas 上重叠的矩形触发 MouseDown 事件

c# - .NET:值类型继承 - 技术限制?