C# 中使用 `async` 和 `await` 时,需要注意点

在 C# 中使用 asyncawait 时,有一些关键点需要注意:

  1. 异步方法命名:

    • 通常建议将异步方法的名称以 Async 结尾,以便清楚地表明方法是异步的。例如:GetDataAsync
  2. async 关键字:

    • 在方法签名中使用 async 关键字,表明该方法是异步的。注意,async 方法可以包含 await 表达式,但不一定必须有 await
  3. 返回类型:

    • 异步方法通常返回 TaskTask<T> 类型。如果方法不返回值,则返回 Task,如果返回特定类型的值,则返回 Task<T>
    • 例外:async void 仅用于事件处理程序中,不应在其他情况下使用,因为它不能被调用者等待,也无法捕获异常。
  4. await 表达式:

    • await 用于等待异步操作完成,并返回其结果。await 后的操作将异步执行,但它并不阻塞线程,而是将控制权返回给调用者,直到任务完成。
    • 只能在标记为 async 的方法或 lambda 表达式中使用 await
  5. 避免死锁:

    • 在 UI 应用程序中,避免在同步上下文中使用 Wait()Result 来阻塞异步操作。这可能会导致死锁,因为 UI 线程可能在等待操作完成,而操作又在等待 UI 线程空闲。
  6. 异常处理:

    • 异常会在 await 时被抛出,因此可以用 try-catch 包裹 await 语句来捕获异常。
    • 如果方法返回 TaskTask<T>,调用者也可以在等待任务时处理异常。
  7. 性能和并行性:

    • 虽然 asyncawait 提供了一种简化异步编程的方式,但它们并不会自动带来并行性。如果需要并行执行多个任务,应该显式地启动多个任务,并使用 Task.WhenAll 等方法等待它们。
  8. ConfigureAwait(false) 的使用:

    • 在库代码中,通常使用 ConfigureAwait(false) 来避免捕获当前同步上下文,这样可以避免某些不必要的上下文切换,提升性能。

通过注意这些关键点,能够更有效地利用 asyncawait 进行异步编程,同时避免常见的陷阱。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值