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

Wesley13
• 阅读 686

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

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

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

public class Dog
    {
        public Task DoSomthingAsync()
        {
            Task task = Task.Run(() => {
                Console.WriteLine("后台任务开始运行");
                Thread.Sleep(5000);
                Console.WriteLine("后台任务运行结束");
            });
            return task;
        }
    } 

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

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

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TaskTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();            
        }

        ///
        ///任务完成后要执行的方法,更新UI
        ///
        private void OnDoSomthingIsComplete(Task t) {
            Action action = () => {
                textBox.Text = "任务完成后显示这段文字到UI控件";
            };
            textBox.Invoke(action);  
        }       
    }
} 

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

3.调用该类的异步方法

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

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TaskTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();            
        }

        private void OnDoSomthingIsComplete(Task t) {//这里的参数:Task t 在下面执行的时候其实就是dog.DoSomthingAsync()
            Action action = () => {
                textBox.Text = "任务完成后显示这段文字到UI控件";
            };
            textBox.Invoke(action);  
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Dog dog = new Dog();
            Task task = dog.DoSomthingAsync().ContinueWith(OnDoSomthingIsComplete);
        }
    }
    /// <summary>
    /// Dog类
    /// </summary>
    public class Dog
    {
        public Task DoSomthingAsync()
        {
            Task task = Task.Run(() => {
                Console.WriteLine("后台任务开始运行");
                Thread.Sleep(5000);
                Console.WriteLine("后台任务运行结束");
            });
            return task;
        }
    }

} 

执行效果如下:

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

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

private void button1_Click(object sender, EventArgs e)
        {
            Dog dog = new Dog();
            Task task = dog.DoSomthingAsync().ContinueWith((Task t)=> {
                Action action = () => {
                    textBox.Text = "任务完成后显示这段文字到UI控件";
                };
                textBox.Invoke(action);
            });
        }
点赞
收藏
评论区
推荐文章
郜小超 郜小超
3年前
用 async/await 来处理异步
一级标题昨天看了一篇vue的教程,作者用async/await来发送异步请求,从服务端获取数据,代码很简洁,同时async/await已经被标准化,是时候学习一下了。先说一下async的用法,它作为一个关键字放到函数前面,用于表示函数是一个异步函数,因为async就是异步的意思,异步函数也就意味着该函数的执行不会阻塞后面代码的执行。写一个async
菜园前端 菜园前端
1年前
什么是JavaScript异步模式
什么是异步模式?不会等待当前任务执行完毕,才会去执行下一个任务,这就是异步模式(Asynchronous)。开启异步后,就会跳过本任务,开始执行下一个任务,后续的逻辑一般会通过回调函数的方式定义。异步模式执行中,涉及到调用栈(Callstack)、消息队列
Stella981 Stella981
3年前
AFNetworking源码分析
不用网络框架进行网络请求NSURLConnection的简单使用(下面的代码均只为了演示,更详细的使用方法请自行谷歌)NSURLConnection提供了两个类方法用于发起同步或异步请求,对于异步请求来说必然是在子线程中发起,若在主线程中发起异步网络请求会造成主线程阻塞,界面无响应,这就涉及到多线程编程。但多线程编程
Stella981 Stella981
3年前
Spring @Async使用
@EnableAsync开启@Async注解功能一、功能@Async注解标记的方法可以使该方法异步的进行调用,如果在类上使用该注解,那么这个类的所有方法都会作为异步方法进行调用注意点,Async注解是基于SpringAop进行实现的,所以在相同的一个类中,方法互相调用是不会起到异步执行的作用的,这里多说一句,任何使用springaop代理实现的
Stella981 Stella981
3年前
AsyncTask的用法
AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程..为什么需要使用异步任务?我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避
Stella981 Stella981
3年前
Excel催化剂开源第8波
在VSTO开发过程中,因其和普通的Winform开发有点差别,具体细节笔者也说不清楚,大概是VSTO的插件是寄生在Excel中,不属于独立的进程之类的,其异步方法调用时,未能如Winform那样直接用awaitasync异步方法就结束,仍需要再作简单的处理。使用场景在Excel上直接使用异步方法,貌似有上述提及的问题,不像Winform程序
Stella981 Stella981
3年前
ES6 Promise
Promisepromise是异步编程的一种解决方案1什么是异步?异步模式,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。"异步模式"非常重要。在浏
Wesley13 Wesley13
3年前
5.4 异步TCP编程(二)
    5.4.2异步TCP应用编程的一般方法(本节可以忽略)  使用异步TCP编程时,除了套接字有对应的异步操作方式外,_TcpListener_和_TcpClient_类均提供了返回结果为_IAsyncResult_类型的异步操作的方法。    1、BeginAcceptTcpClient方法和EndAcceptTcpClien
Wesley13 Wesley13
3年前
5.4 异步TCP编程(三)
5.4.3使用异步方式调用同步方法  .NETFramework提供了一种可以利用委托异步调用任何方法的技术,唯一的要求就是需要声明一个与要调用的方法具有相同签名的委托。对于任何一个方法,如果希望异步执行,最简单的方法就是通过调用委托的BeginInvoke方法开始异步执行,然后执行其他操作,最后调用委托的EndInvoke方法结束异步
京东云开发者 京东云开发者
11个月前
你真的了解@Async吗? | 京东云技术团队
开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送、商品同步等都可以使用异步方法,这时我们可以用到@Async。但是直接使用@Async会有风险,当我们没有指定线程池时,他会默认使用其Spring自带的SimpleAsyncTaskExecutor线程池,会不断的创建线程,当并发大的时候会严重影响性能。所以可以将异步指定线程池使用