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 ...
随机推荐
- Hello Json(c#)
第一步:下载的DLL→Newtonsoft.Json 打开链接后下载这个(有可能版本有所更新,选前面点的就是了): 接下来是新建一个Console项目,然后是引用,然后上码 class Progra ...
- StringBuufer与StringBulder线程的区别
StringBulder的append方法 不是synchronized修饰的 线程不安全 效率相对很快StringBuufer的append方法 是 synchronized修饰的 ...
- 资讯类产品-创业邦APP产品原型模板公开分享
众所周知,知识付费和资讯是近年来两个受关注度极高的互联网产品方向.18年喜马拉雅“123狂欢节”,3天时间内容消费额4.35亿,足见知识付费内容市场的火爆.字节跳动凭借今日头条APP起家,逐渐跻身互联 ...
- CDIE2019中国数字化创新展暨首席信息官峰会上海站来袭~
China Digital Innovation Expo & CIO Summit 2019是由Dot Connector(上海华昂商务咨询有限公司)主办的第五届聚焦中国技术领袖,探索创新, ...
- 自己写的一些公共js方法
/* 说明文件:这里用的都是es6的语法 导入导出,拿vue举个栗子,你只需要在用到的地方,按需要导入就行了,然后在mounted中直接可以拿来用 比如下面的手机****方法,在需要用到的地方impo ...
- FB面经prepare: 3 Window Max Sum
Given a num array, find a window of size k, that has a maximum sum of the k entries. follow-up: Find ...
- PHP洗牌、猴子选大王两个小算法
<一>洗牌算法 /** *洗牌算法washCard *@param $cardNum *@return array */ function washCard($cardNum) { $ca ...
- .NET Core 微服务
github 上的资源: EshopOnContainers AiurSoft : 微服务框架 Server酱:是一款「程序员」和「服务器」之间的通信软件. http://sc.ftqq.com/3. ...
- CentOS7开放端口号
查看所有开放的端口号 firewall-cmd --zone=public --list-ports 或者 firewall-cmd --permanent --list-ports(--perman ...
- iOS项目之使用开关控制日志输出的功能
最近一直在做sdk的项目,用户提出了一个需求,需要屏蔽sdk内部的日志输出.由于sdk内部的日志是为了调试,如果屏蔽了肯定不方便,所以研究了一下日志输出开关的功能. 在这里介绍两种实现方案:一种方案是 ...