1. /// <summary>
  2. /// 异步工具类
  3. /// </summary>
  4. public class TaskTools
  5. {
  6. /// <summary>
  7. /// 是否 在执行回调函数之前修改Running状态
  8. /// </summary>
  9. public bool ChangeRunningStateBeforeCallback { get; private set; }
  10.  
  11. /// <summary>
  12. /// 是否 正在执行异步任务
  13. /// </summary>
  14. public bool Running { get; private set; }
  15.  
  16. public TaskTools()
  17. : this(false)
  18. {
  19.  
  20. }
  21.  
  22. /// <summary>
  23. ///
  24. /// </summary>
  25. /// <param name="changeRunningStateBeforeCallback">是否 在执行回调函数之前修改Running状态 默认值false</param>
  26. public TaskTools(bool changeRunningStateBeforeCallback)
  27. {
  28. this.ChangeRunningStateBeforeCallback = changeRunningStateBeforeCallback;
  29. }
  30.  
  31. /// <summary>
  32. /// 执行异步任务
  33. /// </summary>
  34. /// <typeparam name="T">异步任务返回值类型</typeparam>
  35. /// <param name="control">操作UI时需要Invoke的控件</param>
  36. /// <param name="asyncFunc">将要执行的任务任务</param>
  37. /// <param name="callback">异步任务执行完毕后执行的回调函数</param>
  38. public void Run<T>(Control control, Func<T> asyncFunc, Action<T> callback)
  39. {
  40. if (this.Running)
  41. throw new InvalidOperationException(" the task is running ");
  42. try
  43. {
  44. this.Running = true;
  45. Task<T> task = new Task<T>(() =>
  46. {
  47. try
  48. {
  49. return asyncFunc();
  50. }
  51. catch (Exception ex)
  52. {
  53. Console.WriteLine(ex.Message);
  54. return default(T);
  55. }
  56. });
  57.  
  58. task.Start();
  59.  
  60. TaskContinue<T>(control, task, callback);
  61. }
  62. catch (Exception ex)
  63. {
  64. Console.WriteLine(ex.Message);
  65. }
  66. finally
  67. {
  68. this.Running = false;
  69. }
  70. }
  71.  
  72. /// <summary>
  73. /// 执行异步任务
  74. /// </summary>
  75. /// <typeparam name="T">异步任务返回值类型</typeparam>
  76. /// <param name="control">操作UI时需要Invoke的控件</param>
  77. /// <param name="args">异步任务的传入参数</param>
  78. /// <param name="asyncFunc">将要执行的任务任务</param>
  79. /// <param name="callback">异步任务执行完毕后执行的回调函数</param>
  80. public void Run<T>(Control control, object args, Func<object, T> asyncFunc, Action<T> callback)
  81. {
  82. if (this.Running)
  83. throw new InvalidOperationException(" the task is running ");
  84.  
  85. try
  86. {
  87. this.Running = true;
  88. Task<T> task = new Task<T>((lambdaObj) =>
  89. {
  90. try
  91. {
  92. return asyncFunc(lambdaObj);
  93. }
  94. catch (Exception ex)
  95. {
  96. Console.WriteLine(ex.Message);
  97. return default(T);
  98. }
  99. }, args);
  100.  
  101. task.Start();
  102.  
  103. TaskContinue<T>(control, task, callback);
  104. }
  105. catch (Exception ex)
  106. {
  107. Console.WriteLine(ex.Message);
  108. }
  109. finally
  110. {
  111. this.Running = false;
  112. }
  113. }
  114.  
  115. /// <summary>
  116. /// 延时执行某任务
  117. /// </summary>
  118. /// <param name="control">操作UI时需要Invoke的控件</param>
  119. /// <param name="milliSecond">将要延时执行的毫秒数</param>
  120. /// <param name="callback">异步任务执行完毕后执行的回调函数</param>
  121. public void DelayedRun(int milliSecond, Control control, Action callback)
  122. {
  123. this.Run<int>(control, () =>
  124. {
  125. Thread.Sleep(milliSecond); // 4.0 类库
  126. return milliSecond;
  127. }, (time) =>
  128. {
  129. callback();
  130. });
  131. }
  132.  
  133. /// <summary>
  134. /// Control.Invoke方法的简易封装
  135. /// </summary>
  136. /// <typeparam name="T">参数类型</typeparam>
  137. /// <param name="control"></param>
  138. /// <param name="args"></param>
  139. /// <param name="action"></param>
  140. public static void ControlInvoke<T>(Control control, T args, Action<T> action)
  141. {
  142. try
  143. {
  144. Invoke<T>(control, args, action);
  145. }
  146. catch (Exception ex)
  147. {
  148. Console.WriteLine(ex.Message);
  149. }
  150. }
  151.  
  152. /// <summary>
  153. /// 异步任务完成后继续执行...
  154. /// </summary>
  155. /// <typeparam name="T"></typeparam>
  156. /// <param name="control"></param>
  157. /// <param name="task"></param>
  158. /// <param name="callback"></param>
  159. private void TaskContinue<T>(Control control, Task<T> task, Action<T> callback)
  160. {
  161. task.ContinueWith((lambdaAction) =>
  162. {
  163. if (this.ChangeRunningStateBeforeCallback)
  164. {
  165. this.Running = false;
  166. }
  167. try
  168. {
  169. if (callback != null)
  170. {
  171. // 有UI控件 则将回调函数 注入到UI控件的相关线程中去执行
  172. if (control != null)
  173. {
  174. TaskTools.Invoke<T>(control, lambdaAction.Result, callback);
  175. }
  176. else
  177. {
  178. // 否则在当前线程内执行 回调函数
  179. callback(lambdaAction.Result);
  180. }
  181. }
  182. }
  183. catch (Exception ex)
  184. {
  185. Console.WriteLine(ex.Message);
  186. }
  187. finally
  188. {
  189. this.Running = false;
  190. }
  191. });
  192. }
  193.  
  194. /// <summary>
  195. /// Control.Invoke方法的简易封装
  196. /// 注意 无 Try Catch
  197. /// </summary>
  198. /// <typeparam name="T">参数类型</typeparam>
  199. /// <param name="control"></param>
  200. /// <param name="args"></param>
  201. /// <param name="action"></param>
  202. private static void Invoke<T>(Control control, T args, Action<T> action)
  203. {
  204. // control为空,在当前线程内执行该action
  205. if (control == null)
  206. {
  207. action(args);
  208. return;
  209. }
  210.  
  211. // 控件正在释放或者已经被释放则不执行action
  212. if (control.Disposing || control.IsDisposed)
  213. return;
  214.  
  215. if (control.InvokeRequired)
  216. {
  217. control.Invoke(action, new object[] { args });
  218. }
  219. else
  220. {
  221. action(args);
  222. }
  223. }
  224. }

  

C#操作Control异步工具类的更多相关文章

  1. 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 ...

  2. C# 异步工具类 及一点小小的重构经验

    2015年新年第一篇随笔, 祝福虽然有些晚,但诚意还在:新年快乐. 今天主要是想分享一异步工具类,在C/S架构中.先进行网络资源异步访问,然后将回调函数 Invoke到UI线程中进行UI处理. 这样的 ...

  3. 操作集合的工具类Collections

    1       操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操 ...

  4. Java操作字符串的工具类

    操作字符串的工具类 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStre ...

  5. Java操作图片的工具类

    操作图片的工具类: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.a ...

  6. 【转载】C#工具类:实现文件操作File的工具类

    在应用程序的开发中,文件操作的使用基本上是必不可少的,FileStream类.StreamWriter类.Directory类.DirectoryInfo类等都是文件操作中时常涉及到的类,我们可以通过 ...

  7. 自定义的操作Cookie的工具类

    可以在SpringMVC等环境中使用的操作Cookie的工具类 package utils; import java.io.UnsupportedEncodingException; import j ...

  8. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  9. 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 ...

随机推荐

  1. vue Baidu Map --- vue百度地图插件

    vue Baidu Map 官网:https://dafrok.github.io/vue-baidu-map/#/zh/start/installation javascript 官网:http:/ ...

  2. linux服务器情况

    查看Linux 进程命令  ps -aux 或者ps -ef linux 进程很多 如果需要查找某一个进程可以使用 管道和grep命令 Linux下常用命令  grep  匹配字符   ps 查询Li ...

  3. 我的FPGA之旅4---led流水灯

    [1]输入端口不能使用reg数据类型,因为reg类型对应的FPGA内部的寄存器.这样理解:reg寄存器具有记忆功能;而wire类型数据就相当于一根连线.input输入信号用wire连线进来就好:out ...

  4. xgboost 最优参数, df某一个字段进行字符串搜索

    0.909323  with:   {'max_depth': 6, 'min_child_weight': 0.8, 'n_estimators': 800} df_huoguo = df[df.c ...

  5. DDD领域驱动

    DDD领域驱动领域驱动模型.模型驱动代码接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现,行为使用服务实现,最后造成需求的首肢分离.DDD让你首先考虑的是业务语言而不 ...

  6. MongoDB系列----备份与导入导出

    参考: http://my.oschina.net/xiaomaoandhong/blog/63471,<> 1.停掉服务器 然后备份 Mongodb将所有数据都存放在"数据目录 ...

  7. 关于网站的一些js和css常见问题的记录

    1. 文字超过宽度,给这个后面超过的文字用...来表示  white-space: nowrap;

  8. Kafka笔记7(构建数据管道)

    构建数据管道需要考虑的问题: 及时性  可靠性 高吞吐量和动态吞吐量   数据格式  转换    安全性   故障处理能力  耦合性与灵活性 数据管道的构建分为2个阵营,ETL和ELT ETL:提取- ...

  9. Vue系列之 => webpack处理样式文件

    处理css文件 安装 npm i style-loader css-loader -D main.js import $ from 'jquery' //Es6中导入模块的方式 import './c ...

  10. OAuth授权 | 把这一篇丢给他

    OAuth授权 一.背景 上一篇我们介绍了单点登录(SSO),它能够实现多个系统的统一认证.今天我们来谈一谈近几年来非常流行的,大名鼎鼎的OAuth.它也能完成 统一认证,而且还能做更多的事情.至于O ...