C#异步编程ConfigureAwait的使用小结

 更新时间:2025年08月10日 11:27:12   作者:gs108  
本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.ConfigureAwait,及创建Task的不同方法,感兴趣的可以了解一下

异步编程是并发的一种形式,它有两大好处:

  • 对于面向终端用户的GUI程序,提高了响应能力
  • 对于服务器端应用,利用线程池实现了可扩展性

异步编程的两个关键字:asyncawait

需要注意:如果async方法有返回值,应返回Task<T>;如果没有返回值,应返回Task

严重警告:不要用void作为async方法的返回类型!async方法可以返回void,但这仅限于编写事件处理程序。一个普通的async方法如果没有返回值,要返回Task,而不是void

有了上述背景知识,我们来快速看一个例子:

async Task DoSomethingAsync()
{
	int val = 13; //以同步方式执行
	// 异步方式等待1秒
	await Task.Delay(TimeSpan.FromSeconds(1));
	val *= 2;
	// 异步方式等待1秒
	await Task.Delay(TimeSpan.FromSeconds(1));
	Trace.WriteLine(val);
}

上述代码,DoSomethingAsync方法在最开始时,以同步方式执行。当遇到await时,如果这个异步等待操作没有完成,就暂停DoSomethingAsync方法并返回这个Task,当这个Task完成操作后,继续以同步方式执行后续的代码。

问题:如果在UI线程中调用DoSomethingAsync,这个方法的每个同步程序块都将在此UI线程上运行。怎么避免这种错误行为呢?这就用到了await中的ConfigureAwait方法。

async Task DoSomethingAsync()
{
	int val = 13; //以同步方式执行
	// 异步方式等待1秒
	// 将continueOnCapturedContext参数设为false,则会在线程池线程里继续运行
	await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
	val *= 2;
	// 异步方式等待1秒
	await Task.Delay(TimeSpan.FromSeconds(1));
	Trace.WriteLine(val);
}

关于异步方法,还有一条重要的准测:你一旦在代码中使用了异步,最好一直使用。调用异步方法时,应该用await等待它返回的task对象。一定要避免使用Task.WaitTask<T>.Result方法,因为它们会导致死锁

有两种基本的方法可以创建Task实例

  • Task.Run 创建计算类的任务(CPU实际执行的指令)
  • TaskFactory.StartNew 需要特定的计划运行
  • TaskCompletionSource<T> 创建基于事件的任务(例如:大部分I/O任务)

到此这篇关于C#异步编程ConfigureAwait的使用小结的文章就介绍到这了,更多相关C#异步ConfigureAwait内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C#连接MySql数据库的方法

    C#连接MySql数据库的方法

    最近两天在解决C#连接MySql数据库的问题,通过不同的从网上学习,最终找到了解决的办法,现在和大家分享一下
    2013-10-10
  • C# as 和 is 运算符区别和用法示例解析

    C# as 和 is 运算符区别和用法示例解析

    在C#中,as 和 is 关键字都用于处理类型转换的运算符,但它们有不同的用途和行为,本文我们将详细解释这两个运算符的区别和用法,需要的朋友可以参考下
    2025-01-01
  • C#和JavaScript实现交互的方法

    C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。
    2015-05-05
  • C#中的序列化与反序列化方式

    C#中的序列化与反序列化方式

    本文介绍了C#中的序列化和反序列化概念、目的及其在不同场景中的应用,文章详细讲解了二进制序列化、XML序列化和JSON序列化的方法和特点,并提供了一些示例代码
    2024-12-12
  • c# 泛型类型参数与约束的深入分析

    c# 泛型类型参数与约束的深入分析

    本篇文章是对c#中泛型类型参数与约束进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#实现的海盗分金算法实例

    C#实现的海盗分金算法实例

    这篇文章主要介绍了C#实现的海盗分金算法,结合具体实例形式分析了海盗分金算法的原理与C#相应实现技巧,需要的朋友可以参考下
    2017-07-07
  • C#代码实现在PowerPoint中组合或取消组合形状

    C#代码实现在PowerPoint中组合或取消组合形状

    在 PowerPoint 中,对形状进行组合和取消组合是两个非常实用的功能,本文将介绍如何在 C# 和 VB.NET 中实现 PowerPoint 形状的组合与取消组合操作,希望对大家有所帮助
    2026-05-05
  • C#读取CSV/Excel文件数据并显示在DataGridView

    C#读取CSV/Excel文件数据并显示在DataGridView

    本文介绍了C#读取CSV和Excel文件数据并展示在DataGridView控件中的解决方案,该方案包括文件读取、数据处理、用户界面、性能优化等功能特点,并提供了详细的使用方法和常见问题解决方案,旨在实现多格式支持、智能识别、强大数据处理和用户友好界面
    2026-04-04
  • C#关于Textbox滚动显示最后一行,不闪烁问题

    C#关于Textbox滚动显示最后一行,不闪烁问题

    这篇文章主要介绍了C#关于Textbox滚动显示最后一行,不闪烁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • C#利用VS中插件打包并发布winfrom程序

    C#利用VS中插件打包并发布winfrom程序

    这篇文章主要为大家详细介绍了C#利用VS中插件打包并发布winfrom程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08

最新评论