C# Winform 基于Task的异步与延时执行
一、Task的机制
二、Task的使用
//新建一个Task
Task t1 = new Task(() => {
Console.WriteLine("Task完成!");
});
//启动Task
t1.Start(); Console.WriteLine("UI线程完成!");
上面是用new关键字创建,等同于如下使用Task.Factory(Task工厂)创建的方式:
//新建一个Task(Task工厂创建,自动启动)
Task t1 = Task.Factory.StartNew(() => {
Console.WriteLine("Task完成!");
}); Console.WriteLine("UI线程完成!");
这里为了简便使用了Lambda表达式(=> 为Lambda运算符),上面两部分代码都等同于如下:
void Test()
{
Console.WriteLine("Task完成!");
} Action action = new Action(Test); //新建一个Task
Task t1 = new Task(action);
//启动Task
t1.Start(); Console.WriteLine("UI线程完成!");
运行效果图:
//新建一个Task
Task t1 = new Task(() => {
Console.WriteLine("Task完成!");
});
//启动Task
t1.Start(); Console.WriteLine("UI线程开始等待!");//① t1.Wait(); Console.WriteLine("UI线程完成!");//②
运行效果图:
//新建一个Task
Task t1 = new Task(() => {
Console.WriteLine("Task1完成!");
});
//新建一个Task
Task t2 = new Task(() => {
Console.WriteLine("Task2完成!");
});
//启动Task
t1.Start();
t2.Start(); Console.WriteLine("UI线程开始等待!"); //等待t1,t2都完成
Task.WaitAll(t1,t2); Console.WriteLine("UI线程完成!");
运行效果图:
三、基于Task的异步与延时
/// <summary>
/// 开始一个异步任务
/// </summary>
/// <param name="taskAction">异步任务执行委托</param>
/// <param name="taskEndAction">异步任务执行完毕后的委托(会跳转回UI线程)</param>
/// <param name="control">UI线程的控件</param>
public void StartAsyncTask(Action taskAction, Action taskEndAction, Control control)
{
if (control == null)
{
return;
} Task task = new Task(() => {
try
{
taskAction(); //返回UI线程
control.Invoke(new Action(() =>
{
taskEndAction();
}));
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}); task.Start();
} /// <summary>
/// 开始一个延时任务
/// </summary>
/// <param name="DelayTime">延时时长(秒)</param>
/// <param name="taskEndAction">延时时间完毕之后执行的委托(会跳转回UI线程)</param>
/// <param name="control">UI线程的控件</param>
public void StartDelayTask(int DelayTime, Action taskEndAction, Control control)
{
if (control == null)
{
return;
} Task task = new Task(() => {
try
{
Thread.Sleep(DelayTime * 1000); //返回UI线程
control.Invoke(new Action(() =>
{
taskEndAction();
}));
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}); task.Start();
}
StartAsyncTask主要是执行一个异步操作,并在异步操作完成后执行指定的委托,这里因为Task的执行机制依然是多线程,由于winform的线程安全性使得非UI线程无法访问UI线程中的UI控件,所以在Task操作结束后执行的委托有必要返回到UI线程中,也就是说StartAsyncTask主要的功能就是在taskAction中执行一系列的异步运算,运算结束之后在taskEndAction中进行一些可视化的表现,比如给某某UI控件赋值。
//显示耗时等待界面(比如一串文字:正在加载,请稍等......)
WaitPage.ShowWait(); StartAsyncTask(
() => {
//进行耗时操作......
},
() => {
//耗时操作完成,隐藏耗时等待界面
WaitPage.HideWait();
},
this);
StartDelayTask的使用,异步延时等待:
Console.WriteLine("我军将在三秒后发起反击!");
StartDelayTask(
//等待的秒数
3,
() => {
//等待结束要做的事
Console.WriteLine("我军开始反击!");
},
this);
for (int i = 0; i < 10; i++)
{
Console.WriteLine(String.Format("敌军第{0}轮进攻!",i));
}
运行效果图:
C# Winform 基于Task的异步与延时执行的更多相关文章
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
- 实现基于Task的异步模式
返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...
- 基于Task的异步模式的定义
返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...
- 基于Task的异步模式--全面介绍
今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...
- .Net Core WebAPI 基于Task的同步&异步编程快速入门
.Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...
- Task的异步模式
Task的异步模式 返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的 ...
- C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)
学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是 ...
- C#深度学习のTask(基于任务的异步模型)
一.Task关键字解释 Task 类的表示的单个操作不会返回一个值,通常以异步方式执行. Task 对象是一种的中心思想 基于任务的异步编程模式 首次引入.NET Framework 4 中. 因为由 ...
- 15.6.1 【Task使用】基于任务的异步模式
C# 5异步函数特性的一大好处是,它为异步提供了一致的方案.但如果在命名异步方法以及 触发异常等方面做法存在着差异,则很容易破坏这种一致性.微软因此发布了基于任务的异步模 式(Task-based A ...
随机推荐
- Java学习篇之---json-lib(Maven)
json-lib(Maven) java中用于解释json的主流工具有org.json.json-lib与gson.本篇文章介绍json-lib. 项目中要用到json-lib.在pom.xml文件里 ...
- 算不算类似微信小程序
这几天微信发布的微信里生成小程序,刷爆了朋友圈. 微信生成的小程序不用下载安装就能在手机里出现,即用即删. 想到这里,我想到苹果手机本身再带类似于微信的小程序的呈现方式,也可以即用即删,那是我在去年久 ...
- js中 opener和parent的差别
opener即谁打开我的,比方A页面利用window.open弹出了B页面窗体.那么A页面所在窗体就是B页面的opener.在B页面通过opener对象能够訪问A页面. parent表示父窗体,比方一 ...
- mysql慢查询日志分析工具(python写的)
D:\NormalSoftware>python mysql_filter_slow_log.py ./mysql1-slow.log --no-duplicates --sort-avg-qu ...
- [Sdoi2013]直径(树的直径)
//36分 #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> # ...
- jqcloud 标签云效果
官网地址: http://mistic100.github.io/jQCloud/index.htmlgithub 地址: https://github.com/lucaong/jQCloud使用 & ...
- 基于SpringMVC国际化资源配置方式
1.首先需要在spring-mvc-servlet.xml 中配置拦截器: <bean id="localeChangeInterceptor" class="or ...
- 【题解】POJ2279 Mr.Young′s Picture Permutations dp
[题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能 ...
- inux c编程:读写锁
前面介绍的互斥量加锁要么是锁状态,要么就是不加锁状态.而且只有一次只有一个线程可以对其加锁.这样的目的是为了防止变量被不同的线程修改.但是如果有线程只是想读而不会去写的话,这有不会导致变量被修改.但是 ...
- Intel Quick Sync Video Encoder 2
这边博客主要记录在预研quick sync中涉及到的一些性能质量相关的关键参数设置. github: https://github.com/MarkRepo/qsve 1. VPP处理过程伪代码: M ...