C#中async和await的讲解
创作时间:
作者:
@小白创作中心
C#中async和await的讲解
引用
CSDN
1.
https://blog.csdn.net/qq_41375318/article/details/144289043
async和await是C#中用于简化异步编程的重要特性。它们的主要目的是降低编程难度,使开发者能够以同步编程的方式编写异步代码。本文将详细介绍async和await的设计目的、使用优点以及具体应用场景,并通过代码示例帮助读者更好地理解相关概念。
async和await的讲解
async和await是为降低编程难度设计的,所以本身是很简单的。
设计async和await的目的
顺序编程,不阻塞线程,降低编程难度(以同步编程的方式来写异步)。
优点:
- 避免回调地狱:传统的异步编程通常使用回调函数,这可能导致代码结构复杂,难以理解和维护。async 和 await 可以避免这种情况。
- 更好的错误处理:异步方法可以像同步方法一样使用 try-catch 块来处理异常
- 提高性能:通过异步编程,应用程序可以在等待I/O操作完成时继续执行其他任务,从而提高应用程序的响应性和吞吐量。
public static async void ShowMessageDialogByTime(string host, string title, string tipText, bool isQuestion)
{
CommonDialogParams ps = new CommonDialogParams()
{ DialogHost = host, DialogTitle = title, DialogTipText = tipText, IsQuestion = isQuestion };
DialogHost.Show(new CurcularProgressView(), host);
try
{
await Task.Run(() =>
{
Thread.Sleep(1000);
});
}
finally
{
// 执行完毕后,关闭窗口
DialogHost.Close(host);
}
}
使用注意:
- async 声明为异步方法,不会阻塞,异步执行,不会阻塞当前线程
- await 等同 task.wait(),await 会等待线程方法执行结束为止,直到 task 执行结束,才会执行下面的代码
带返回值的异步方法
public async Task test(string a)
{
//await Console.WriteLine("同步的方法");
Task<string> task = new Task<string>(() =>
{
return "hello";
});
await task;
}
private async void button1_Click(object sender, EventArgs e)
{
await test("major");
}
返回Task的必须有await和return
public static async Task<object> ShowCurcularProgress(string host, Action action)
{
// 显示窗口
DialogHost.Show(new CurcularProgressView(), host);
try
{
await Task.Run(() =>
{
action();
});
return new CommonDialogResult() { Button = CommonDialogButton.Ok };
}
finally
{
// 执行完毕后,关闭窗口
DialogHost.Close(host);
}
}
代码示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace 异步async和await
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// 该方法不会阻塞主线程
public async void test2()
{
var task = Task.Run(() =>
{
Thread.Sleep(4000);
MessageBox.Show("hello2222");
});
// await会等待线程方法执行结束为止, 直到task执行结束,才会执行MessageBox.Show("hello9999922");
await task;
MessageBox.Show("hello9999922");
}
private void btnclick(object sender, RoutedEventArgs e)
{
// 调用异步方法
test2();
MessageBox.Show("按钮点击了");
// 同样效果
//Action action = () =>
//{
// Thread.Sleep(300000);
//};
//Task task2 = new Task(action);
//task2.Start(); ===> Task.Run()
// task.wait() ==> await
}
}
}
热门推荐
《蛟龙行动》遭遇排片困境:一部被低估的军事大片
《甄嬛传》原著中被砍掉的三个关键人物,华妃亲妹,终极反派
17 个玉米品种逐个数:看看您都知道哪些?(附图片)
玉米的播种时间、播种密度与播种量问题
元旦北京自驾游:雁栖湖畔的冬日童话与百里山水画廊的冰雪世界
北京秋游攻略:抓住最后的金秋美景!
潮安区深度游:龙湖古寨与凤凰山的完美邂逅
《甄嬛传》安陵容:从姐妹情深到反目成仇,她的自卑与不甘
郑州方特欢乐世界:必打卡刺激项目大揭秘!
带娃畅玩郑州方特:必打卡项目推荐!
郑州方特一日游完美攻略,暴风眼等你来挑战!
云南文山深度游指南:3-5天最佳路线规划与景点推荐
云南文山深度游指南:3-5天最佳路线规划与景点推荐
文山旅游攻略:景点、美食与住宿全攻略
牙科恐惧症?这些心理调适技巧让你不再怕看牙!
牙疼不止?牙髓炎和龋齿了解一下!
高压氧治疗爆震性耳聋:原理、效果与注意事项
白求恩医院专家提醒:这些情况要谨防爆震性耳聋
夏日自驾皖南川藏线,这些避暑胜地你不能错过!
秋冬打卡皖南川藏线:青龙湾、水墨汀溪、月亮湾
水韵江苏:秋季最美自然景观打卡地
打卡江苏历史文化胜地:南京博物院&苏州园林
元旦打卡“水韵江苏”:秦淮河畔赏灯会,拙政园中品园林
冬日打卡苏州园林,邂逅500年前的"阳光房"
女人梦见掉牙是凶兆吗
石墨烯电池:未来、优势和关键应用
秋冬吃小黄鱼,怎么挑才最鲜?
自贡牙科收费价目表:种植牙3980+/牙齿矫正9800+/补牙200+
福州必尝:七星鱼丸,吃货打卡圣地!
福州镇海楼:千年名楼展新颜