C#操作Control异步工具类
- /// <summary>
- /// 异步工具类
- /// </summary>
- public class TaskTools
- {
- /// <summary>
- /// 是否 在执行回调函数之前修改Running状态
- /// </summary>
- public bool ChangeRunningStateBeforeCallback { get; private set; }
- /// <summary>
- /// 是否 正在执行异步任务
- /// </summary>
- public bool Running { get; private set; }
- public TaskTools()
- : this(false)
- {
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="changeRunningStateBeforeCallback">是否 在执行回调函数之前修改Running状态 默认值false</param>
- public TaskTools(bool changeRunningStateBeforeCallback)
- {
- this.ChangeRunningStateBeforeCallback = changeRunningStateBeforeCallback;
- }
- /// <summary>
- /// 执行异步任务
- /// </summary>
- /// <typeparam name="T">异步任务返回值类型</typeparam>
- /// <param name="control">操作UI时需要Invoke的控件</param>
- /// <param name="asyncFunc">将要执行的任务任务</param>
- /// <param name="callback">异步任务执行完毕后执行的回调函数</param>
- public void Run<T>(Control control, Func<T> asyncFunc, Action<T> callback)
- {
- if (this.Running)
- throw new InvalidOperationException(" the task is running ");
- try
- {
- this.Running = true;
- Task<T> task = new Task<T>(() =>
- {
- try
- {
- return asyncFunc();
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- return default(T);
- }
- });
- task.Start();
- TaskContinue<T>(control, task, callback);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- this.Running = false;
- }
- }
- /// <summary>
- /// 执行异步任务
- /// </summary>
- /// <typeparam name="T">异步任务返回值类型</typeparam>
- /// <param name="control">操作UI时需要Invoke的控件</param>
- /// <param name="args">异步任务的传入参数</param>
- /// <param name="asyncFunc">将要执行的任务任务</param>
- /// <param name="callback">异步任务执行完毕后执行的回调函数</param>
- public void Run<T>(Control control, object args, Func<object, T> asyncFunc, Action<T> callback)
- {
- if (this.Running)
- throw new InvalidOperationException(" the task is running ");
- try
- {
- this.Running = true;
- Task<T> task = new Task<T>((lambdaObj) =>
- {
- try
- {
- return asyncFunc(lambdaObj);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- return default(T);
- }
- }, args);
- task.Start();
- TaskContinue<T>(control, task, callback);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- this.Running = false;
- }
- }
- /// <summary>
- /// 延时执行某任务
- /// </summary>
- /// <param name="control">操作UI时需要Invoke的控件</param>
- /// <param name="milliSecond">将要延时执行的毫秒数</param>
- /// <param name="callback">异步任务执行完毕后执行的回调函数</param>
- public void DelayedRun(int milliSecond, Control control, Action callback)
- {
- this.Run<int>(control, () =>
- {
- Thread.Sleep(milliSecond); // 4.0 类库
- return milliSecond;
- }, (time) =>
- {
- callback();
- });
- }
- /// <summary>
- /// Control.Invoke方法的简易封装
- /// </summary>
- /// <typeparam name="T">参数类型</typeparam>
- /// <param name="control"></param>
- /// <param name="args"></param>
- /// <param name="action"></param>
- public static void ControlInvoke<T>(Control control, T args, Action<T> action)
- {
- try
- {
- Invoke<T>(control, args, action);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- /// <summary>
- /// 异步任务完成后继续执行...
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="control"></param>
- /// <param name="task"></param>
- /// <param name="callback"></param>
- private void TaskContinue<T>(Control control, Task<T> task, Action<T> callback)
- {
- task.ContinueWith((lambdaAction) =>
- {
- if (this.ChangeRunningStateBeforeCallback)
- {
- this.Running = false;
- }
- try
- {
- if (callback != null)
- {
- // 有UI控件 则将回调函数 注入到UI控件的相关线程中去执行
- if (control != null)
- {
- TaskTools.Invoke<T>(control, lambdaAction.Result, callback);
- }
- else
- {
- // 否则在当前线程内执行 回调函数
- callback(lambdaAction.Result);
- }
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- finally
- {
- this.Running = false;
- }
- });
- }
- /// <summary>
- /// Control.Invoke方法的简易封装
- /// 注意 无 Try Catch
- /// </summary>
- /// <typeparam name="T">参数类型</typeparam>
- /// <param name="control"></param>
- /// <param name="args"></param>
- /// <param name="action"></param>
- private static void Invoke<T>(Control control, T args, Action<T> action)
- {
- // control为空,在当前线程内执行该action
- if (control == null)
- {
- action(args);
- return;
- }
- // 控件正在释放或者已经被释放则不执行action
- if (control.Disposing || control.IsDisposed)
- return;
- if (control.InvokeRequired)
- {
- control.Invoke(action, new object[] { args });
- }
- else
- {
- action(args);
- }
- }
- }
C#操作Control异步工具类的更多相关文章
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- C# 异步工具类 及一点小小的重构经验
2015年新年第一篇随笔, 祝福虽然有些晚,但诚意还在:新年快乐. 今天主要是想分享一异步工具类,在C/S架构中.先进行网络资源异步访问,然后将回调函数 Invoke到UI线程中进行UI处理. 这样的 ...
- 操作集合的工具类Collections
1 操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操 ...
- Java操作字符串的工具类
操作字符串的工具类 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStre ...
- Java操作图片的工具类
操作图片的工具类: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.a ...
- 【转载】C#工具类:实现文件操作File的工具类
在应用程序的开发中,文件操作的使用基本上是必不可少的,FileStream类.StreamWriter类.Directory类.DirectoryInfo类等都是文件操作中时常涉及到的类,我们可以通过 ...
- 自定义的操作Cookie的工具类
可以在SpringMVC等环境中使用的操作Cookie的工具类 package utils; import java.io.UnsupportedEncodingException; import j ...
- java里poi操作excel的工具类(兼容各版本)
转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...
- Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类
FileService.java也就是操作sdcard的工具类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...
随机推荐
- vue Baidu Map --- vue百度地图插件
vue Baidu Map 官网:https://dafrok.github.io/vue-baidu-map/#/zh/start/installation javascript 官网:http:/ ...
- linux服务器情况
查看Linux 进程命令 ps -aux 或者ps -ef linux 进程很多 如果需要查找某一个进程可以使用 管道和grep命令 Linux下常用命令 grep 匹配字符 ps 查询Li ...
- 我的FPGA之旅4---led流水灯
[1]输入端口不能使用reg数据类型,因为reg类型对应的FPGA内部的寄存器.这样理解:reg寄存器具有记忆功能;而wire类型数据就相当于一根连线.input输入信号用wire连线进来就好:out ...
- xgboost 最优参数, df某一个字段进行字符串搜索
0.909323 with: {'max_depth': 6, 'min_child_weight': 0.8, 'n_estimators': 800} df_huoguo = df[df.c ...
- DDD领域驱动
DDD领域驱动领域驱动模型.模型驱动代码接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现,行为使用服务实现,最后造成需求的首肢分离.DDD让你首先考虑的是业务语言而不 ...
- MongoDB系列----备份与导入导出
参考: http://my.oschina.net/xiaomaoandhong/blog/63471,<> 1.停掉服务器 然后备份 Mongodb将所有数据都存放在"数据目录 ...
- 关于网站的一些js和css常见问题的记录
1. 文字超过宽度,给这个后面超过的文字用...来表示 white-space: nowrap;
- Kafka笔记7(构建数据管道)
构建数据管道需要考虑的问题: 及时性 可靠性 高吞吐量和动态吞吐量 数据格式 转换 安全性 故障处理能力 耦合性与灵活性 数据管道的构建分为2个阵营,ETL和ELT ETL:提取- ...
- Vue系列之 => webpack处理样式文件
处理css文件 安装 npm i style-loader css-loader -D main.js import $ from 'jquery' //Es6中导入模块的方式 import './c ...
- OAuth授权 | 把这一篇丢给他
OAuth授权 一.背景 上一篇我们介绍了单点登录(SSO),它能够实现多个系统的统一认证.今天我们来谈一谈近几年来非常流行的,大名鼎鼎的OAuth.它也能完成 统一认证,而且还能做更多的事情.至于O ...