C# async和await:简化异步编程的利器

1 下载量 181 浏览量 更新于2024-09-01 收藏 179KB PDF 举报
本文主要探讨了C#5.0中的async和await关键字如何简化异步编程,这两个关键字在处理网络请求、UI交互等异步操作时带来的显著优势。在传统的同步代码中,当向Web服务器发送请求时,如果代码是同步执行,会导致应用程序在等待响应期间阻塞,用户无法进行其他操作,这严重影响了用户体验。 在C#中,async关键字用于标记一个方法为异步,而await关键字用于暂停当前任务,直到其返回值可用。当调用一个使用await的异步方法时,编译器会自动创建一个任务,并在后台执行,同时主线程继续执行其他代码。这样,即使在网络请求过程中,用户界面也不会冻结,提高了程序的响应性。 例如,在一个Windows Forms应用程序中,当点击按钮发送一个HTTP请求获取数据时,如果没有使用async和await,代码会像下面这样: ```csharp private void btnClick_Click(object sender, EventArgs e) { btnClick.Enabled = false; // 阻塞UI long length = AccessWebSync(); // 同步请求 btnClick.Enabled = true; OtherWork(); // 可能需要时间完成的操作 richTextBox1.Text += String.Format("\n回复的字节长度为:{0}.\r\n", length); txbMainThreadID.Text = Thread.CurrentThread.ManagedThreadId.ToString(); } private long AccessWebSync() { // 同步请求,阻塞主线程 // ... } ``` 通过async/await,这段代码可以改写为: ```csharp private async void btnClick_Click(object sender, EventArgs e) { btnClick.Enabled = false; var length = await AccessWebAsync(); // 使用await等待异步操作完成 btnClick.Enabled = true; OtherWork(); richTextBox1.Text += String.Format("\n回复的字节长度为:{0}.\r\n", length); txbMainThreadID.Text = Thread.CurrentThread.ManagedThreadId.ToString(); } private async Task<long> AccessWebAsync() { btnClick.Enabled = false; // 在开始时禁用按钮,避免UI卡顿 using (var content = await new MemoryStream()) // 使用async方法并await其结果 { // 异步发送Web请求 var webRequest = WebRequest.Create("http://..."); using (var response = await webRequest.GetResponseAsync()) { // 处理响应 // ... } } btnClick.Enabled = true; // 在完成响应后恢复按钮 } ``` 通过这种方式,异步请求在后台线程执行,主线程保持活跃,从而避免了界面冻结的问题,提升了用户体验。这显示了async和await如何通过优化代码结构,使得编写异步程序更加直观和高效。