0

0

C# 怎么使用 async 和 await 实现异步编程_C# async await 异步编程实战指南

幻夢星雲

幻夢星雲

发布时间:2025-11-06 22:15:24

|

208人浏览过

|

来源于php中文网

原创

答案:async/await用于异步编程,避免阻塞主线程。1. async方法返回Task或Task,用await等待任务完成;2. UI应用中使用可防止界面冻结,支持异常处理与取消操作;3. 避免使用.Result、Wait()和async void,合理使用ConfigureAwait(false)提升性能。

c# 怎么使用 async 和 await 实现异步编程_c# async await 异步编程实战指南

在 C# 中使用 asyncawait 实现异步编程,是现代 .NET 开发中处理耗时操作(如网络请求、文件读写、数据库查询等)而不阻塞主线程的标准方式。掌握 async/await 能显著提升程序响应性和性能。

理解 async 和 await 的基本概念

async 修饰符用于标记一个方法为异步方法,表示该方法内部可能包含一个或多个 await 表达式。await 则用于等待一个任务(Task 或 Task)完成,期间不会阻塞当前线程。

注意:async 方法必须返回 void、Task 或 Task。推荐尽可能使用 Task 而非 void,以便调用方可以等待和处理异常。

示例:一个简单的异步方法

public async Task DownloadDataAsync(string url)
{
    using (var client = new HttpClient())
    {
        var data = await client.GetStringAsync(url);
        return data;
    }
}

在 UI 应用中避免界面冻结

在 WinForms 或 WPF 等 UI 应用中,长时间运行的操作如果在主线程执行,会导致界面卡死。通过 async/await 可将这些操作放到后台线程执行,保持界面响应。

调用异步方法时使用 await,系统会在任务完成后自动回到原上下文(如 UI 线程),安全更新控件。

WPF 示例:按钮点击事件中调用异步方法

MyMap AI
MyMap AI

使用AI将想法转化为图表

下载
private async void Button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        string result = await DownloadDataAsync("https://example.com");
        textBox.Text = result; // 可安全访问 UI 控件
    }
    catch (Exception ex)
    {
        MessageBox.Show("出错: " + ex.Message);
    }
}

正确处理异常和取消操作

异步方法中的异常会封装在返回的 Task 中。使用 try-catch 包裹 await 表达式可捕获异常。

对于长时间运行的任务,应支持取消功能。使用 CancellationToken 可实现优雅取消。

带取消支持的异步方法调用

private async Task LoadDataWithCancelAsync()
{
    using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)))
    {
        try
        {
            string data = await DownloadDataAsync("https://api.example.com/data", cts.Token);
            Console.WriteLine(data);
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("请求已取消");
        }
        catch (Exception ex)
        {
            Console.WriteLine("错误: " + ex.Message);
        }
    }
}

// 修改原方法以接收 token public async Task DownloadDataAsync(string url, CancellationToken token = default) { using (var client = new HttpClient()) { var response = await client.GetAsync(url, token); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(token); } }

避免常见陷阱

  • 不要在非 async 方法中使用 await —— 这会导致编译错误
  • 避免使用 .Result 或 .Wait() 强行同步等待异步方法,容易引发死锁,尤其是在 UI 或 ASP.NET 上下文中。
  • async void 应仅用于事件处理程序;其他情况使用 async Task。
  • 合理配置 await 的上下文。若不需要恢复到原始上下文(如不需要访问 UI 控件),可使用 .ConfigureAwait(false) 提升性能并减少死锁风险。

使用 ConfigureAwait 避免不必要的上下文捕获

public async Task GetDataAsync()
{
    var data = await httpClient.GetStringAsync(url)
        .ConfigureAwait(false); // 不恢复到原上下文
    return Process(data);
}

基本上就这些。async/await 让异步编程变得像写同步代码一样直观,只要理解其机制并遵循最佳实践,就能写出高效、可维护的异步逻辑。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

171

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

89

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

462

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

462

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

324

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2066

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

346

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

250

2023.09.05

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.8万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号