.NET异步编程:async/await与Task使用详解

3 下载量 138 浏览量 更新于2024-09-01 收藏 109KB PDF 举报
“这篇教程主要讲解了.NET框架中的async和await关键字以及Task类的异步调用方式,并通过实例展示了如何实现异步操作,包括取消执行和显示进度的功能。” 在.NET框架中,async和await关键字是自.NET 4.5版本引入的,用于简化异步编程的复杂性。在传统的异步编程模式中,开发者通常需要手动处理回调函数和状态对象,如IAsyncResult和BeginInvoke。async和await的出现使得编写非阻塞的异步代码变得更加直观和易于理解。 (一)async关键字 async关键字用于修饰方法,声明该方法是一个异步方法。异步方法会返回一个Task或Task<T>类型的对象,表示异步操作的状态。当方法前加上async时,它内部可以包含一个或多个await表达式,这些表达式会暂停方法的执行,直到被await的任务完成。 (二)await关键字 await关键字用于等待一个异步任务完成。当遇到await关键字时,控制权会返回给调用者,不会阻塞当前上下文,而是让出CPU资源,直到等待的任务完成。一旦任务完成,await后面的代码将会继续执行。 (三)Task类 Task类是.NET中异步操作的核心,它代表了一个异步操作。你可以通过Task.Run、Task.Factory.StartNew等方式启动一个异步任务,或者直接在async方法中使用await操作符等待Task的完成。 (四)异步调用实例 在上述的示例中,我们创建了一个WasteTimeObject类,其中包含一个耗时的GetSlowString方法。为了不阻塞UI线程,我们可以使用异步调用来调用这个方法。首先定义一个委托GetSlowStringDelegate,然后在button1_Click事件处理程序中,使用异步方式调用GetSlowString方法: ```csharp private async void button1_Click(object sender, EventArgs e) { WasteTimeObject ad = new WasteTimeObject(); GetSlowStringDelegate getSlowStringDel = ad.GetSlowString; textBox1.Text = "Requesting st"; string result = await Task.Run(() => getSlowStringDel(0, 10)); textBox1.Text = result; } ``` (五)取消执行 .NET提供CancellationToken和CancellationTokenSource类来支持异步操作的取消。你可以创建一个CancellationTokenSource,然后将它的Token传递给Task,当需要取消任务时,调用CancellationTokenSource的Cancel方法。 (六)显示进度 展示异步操作的进度通常需要在异步方法中定期更新进度信息,并通过某种方式(如事件、回调)传递给UI线程。例如,你可以在异步方法内部创建一个Progress类的实例,然后在UI线程中订阅其ProgressChanged事件来显示进度。 通过以上知识点,开发者可以更好地理解和运用.NET中的async和await关键字,以及Task类来实现高效的异步编程,同时掌握如何进行异步操作的取消和进度显示。