C# 基于任务的异步模式的创建与使用的简单示例
对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法。
1.创建一个拥有异步方法的类
该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带Async后缀
public class Dog
{
public Task DoSomthingAsync()
{
Task task = Task.Run(() => {
Console.WriteLine("后台任务开始运行");
Thread.Sleep();
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();
Console.WriteLine("后台任务运行结束");
});
return task;
}
} }
执行效果如下:

最后再说明下,对于任务执行完成后要执行处理程序,可不不用显式指定方法名,下面用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);
});
}
C# 基于任务的异步模式的创建与使用的简单示例的更多相关文章
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
- 实现基于Task的异步模式
返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...
- 基于Task的异步模式的定义
返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...
- Event-based Asynchronous Pattern Overview基于事件的异步模式概览
https://msdn.microsoft.com/zh-cn/library/wewwczdw(v=vs.110).aspx Applications that perform many task ...
- 基于事件的异步模式——BackgroundWorker
实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...
- C#基于任务的异步模式
using System; using System.Threading; using System.Threading.Tasks; using static System.Console; //异 ...
- .NET 基于任务的异步模式(Task-based Asynchronous Pattern,TAP) async await
本文内容 概述 编写异步方法 异步程序中的控制流 API 异步方法 线程 异步和等待 返回类型和参数 参考资料 下载 Demo 下载 Demo TPL 与 APM 和 EAP 结合(APM 和 EAP ...
- C#中的异步调用及异步设计模式(三)——基于事件的异步模式
四.基于事件的异步模式(设计层面) 基于事件的C#异步编程模式是比IAsyncResult模式更高级的一种异步编程模式,也被用在更多的场合.该异步模式具有以下优点: · ...
- 三、基于任务的异步模式(TAP),推荐使用
一.引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用AP ...
随机推荐
- hive中安装hive_utils模块
1. 因为在linux部署的python 3.6 在安装模块的时候遇到了许多问题,所以使用linux中的python3.6环境 2. 首先使用pip安装 hive_utils 模块sudo pip i ...
- Oralce安装、使用过程中出现的问题
OracleDBControl启动失败Unable to determine local host from URL REPOSITORY_URL=http://your-url.co 解决方法 打开 ...
- Unity shader学习之屏幕后期处理效果之均值模糊
均值模糊,也使用卷积来实现,之不过卷积中每个值均相等,且相加等于1. 代码如下, 子类: using UnityEngine; public class MeanBlurRenderer : Post ...
- Sitecore安装(手动方式)
Sitecore安装 Sitecore提供手动安装压缩包(.zip)和自动安装程序包(.exe),当您运行自动安装程序时,引导界面会指导您一步步进行安装.为了让您更细致的了解Sitecore的安装配置 ...
- Gitlab注册时报错:There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.
今天注册时碰到以下问题: 上面的错误是因为注册时有一个google的验证码需要输入.但是中国无法访问google,因此无法访问并输入该验证码导致. 解决方案: FanQiang或者通过Github登陆 ...
- jQuery选择器--selector1,selector2,selectorN和ancestor descendant
selector1,selector2,selectorN 概述 将每一个选择器匹配到的元素合并后一起返回.你可以指定任意多个选择器,并将匹配到的元素合并到一个结果内 参数 selector1 ...
- Linux 运维测试及第三应用及测试工具
一 .第三方应用及测试工具链接地址 https://pan.baidu.com/s/1rLQ5NCZvxcy93YQ4fGFaBQ 1.linux LSI系列raid卡监测工具 1)使用参数详解链接: ...
- 【Scala学习之二】 Scala 集合 Trait Actor
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- 【Alpha版本】冲刺阶段——Day4
[Alpha版本]冲刺阶段--Day4 阅读目录 今日进展 问题困难 明日任务 今日贡献量 TODOlist [今日进展] 完成注册类代码 public class Register { privat ...
- LCA 最近公共祖先 (模板)
#include <iostream> #include <stdio.h> #include <cstring> #include <vector> ...