C# 基于任务的异步模式的创建与使用的简单示例

对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法。

1.创建一个拥有异步方法的类

该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带Async后缀

1public class Dog 2 { 3 public Task DoSomthingAsync() 4 { 5 Task task = Task.Run(() => { 6 Console.WriteLine("后台任务开始运行"); 7 Thread.Sleep(5000); 8 Console.WriteLine("后台任务运行结束"); 9 }); 10 return task; 11 } 12 } 

当调用该方法的时候,就是异步执行的。为了在该方法执行完成后做进一步处理,需要写一个任务完成后的程序来做点事情,比如更新UI控件。

2.创建任务完成后需要执行的方法

1using System; 2using System.Threading; 3using System.Threading.Tasks; 4using System.Windows.Forms; 5 6namespace TaskTest 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 /// 16 ///任务完成后要执行的方法,更新UI 17 /// 18 private void OnDoSomthingIsComplete(Task t) { 19 Action action = () => { 20 textBox.Text = "任务完成后显示这段文字到UI控件"; 21 }; 22 textBox.Invoke(action); 23 } 24 } 25} 

对于上面定义的这个OnDoSonthingIsComplete方法,我采用了类似于事件方式的命名规则。
另外,这个方法也和使用BackgroundWorker类一样,并不是在调用者线程上执行的,而是在异步线程中执行的。这就是为什么需要使用textBox.Invoke方法。

3.调用该类的异步方法

在button按下的时候调用。这里把上面所有的代码都整合在一起了。

1using System; 2using System.Threading; 3using System.Threading.Tasks; 4using System.Windows.Forms; 5 6namespace TaskTest 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 private void OnDoSomthingIsComplete(Task t) {//这里的参数:Task t 在下面执行的时候其实就是dog.DoSomthingAsync() 16 Action action = () => { 17 textBox.Text = "任务完成后显示这段文字到UI控件"; 18 }; 19 textBox.Invoke(action); 20 } 21 22 private void button1_Click(object sender, EventArgs e) 23 { 24 Dog dog = new Dog(); 25 Task task = dog.DoSomthingAsync().ContinueWith(OnDoSomthingIsComplete); 26 } 27 } 28 /// <summary> 29 /// Dog类 30 /// </summary> 31 public class Dog 32 { 33 public Task DoSomthingAsync() 34 { 35 Task task = Task.Run(() => { 36 Console.WriteLine("后台任务开始运行"); 37 Thread.Sleep(5000); 38 Console.WriteLine("后台任务运行结束"); 39 }); 40 return task; 41 } 42 } 43 44} 

执行效果如下:

 

最后再说明下,对于任务执行完成后要执行处理程序,可不不用显式指定方法名,下面用lambda方式会更简练:

1private void button1_Click(object sender, EventArgs e) 2 { 3 Dog dog = new Dog(); 4 Task task = dog.DoSomthingAsync().ContinueWith((Task t)=> { 5 Action action = () => { 6 textBox.Text = "任务完成后显示这段文字到UI控件"; 7 }; 8 textBox.Invoke(action); 9 }); 10 }
点赞
收藏

评论区

加载中...

相关推荐

什么是JavaScript异步模式

什么是异步模式?不会等待当前任务执行完毕,才会去执行下一个任务,这就是异步模式(Asynchronous)。开启异步后,就会跳过本任务,开始执行下一个任务,后续的逻辑一般会通过回调函数的方式定义。异步模式执行中,涉及到调用栈(Callstack)、消息队列

AFNetworking源码分析

不用网络框架进行网络请求NSURLConnection的简单使用(下面的代码均只为了演示,更详细的使用方法请自行谷歌)NSURLConnection提供了两个类方法用于发起同步或异步请求,对于异步请求来说必然是在子线程中发起,若在主线程中发起异步网络请求会造成主线程阻塞,界面无响应,这就涉及到多线程编程。但多线程编程

Spring @Async使用

@EnableAsync开启@Async注解功能一、功能@Async注解标记的方法可以使该方法异步的进行调用,如果在类上使用该注解,那么这个类的所有方法都会作为异步方法进行调用注意点,Async注解是基于SpringAop进行实现的,所以在相同的一个类中,方法互相调用是不会起到异步执行的作用的,这里多说一句,任何使用springaop代理实现的

AsyncTask的用法

AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程..为什么需要使用异步任务?我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避

Excel催化剂开源第8波

在VSTO开发过程中,因其和普通的Winform开发有点差别,具体细节笔者也说不清楚,大概是VSTO的插件是寄生在Excel中,不属于独立的进程之类的,其异步方法调用时,未能如Winform那样直接用awaitasync异步方法就结束,仍需要再作简单的处理。使用场景在Excel上直接使用异步方法,貌似有上述提及的问题,不像Winform程序

ES6 Promise

Promisepromise是异步编程的一种解决方案1什么是异步?异步模式,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。"异步模式"非常重要。在浏