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. Hello Json(c#)

    第一步:下载的DLL→Newtonsoft.Json 打开链接后下载这个(有可能版本有所更新,选前面点的就是了): 接下来是新建一个Console项目,然后是引用,然后上码  class Progra ...

  2. StringBuufer与StringBulder线程的区别

    StringBulder的append方法 不是synchronized修饰的   线程不安全     效率相对很快StringBuufer的append方法  是 synchronized修饰的  ...

  3. 资讯类产品-创业邦APP产品原型模板公开分享

    众所周知,知识付费和资讯是近年来两个受关注度极高的互联网产品方向.18年喜马拉雅“123狂欢节”,3天时间内容消费额4.35亿,足见知识付费内容市场的火爆.字节跳动凭借今日头条APP起家,逐渐跻身互联 ...

  4. CDIE2019中国数字化创新展暨首席信息官峰会上海站来袭~

    China Digital Innovation Expo & CIO Summit 2019是由Dot Connector(上海华昂商务咨询有限公司)主办的第五届聚焦中国技术领袖,探索创新, ...

  5. 自己写的一些公共js方法

    /* 说明文件:这里用的都是es6的语法 导入导出,拿vue举个栗子,你只需要在用到的地方,按需要导入就行了,然后在mounted中直接可以拿来用 比如下面的手机****方法,在需要用到的地方impo ...

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

  7. PHP洗牌、猴子选大王两个小算法

    <一>洗牌算法 /** *洗牌算法washCard *@param $cardNum *@return array */ function washCard($cardNum) { $ca ...

  8. .NET Core 微服务

    github 上的资源: EshopOnContainers AiurSoft : 微服务框架 Server酱:是一款「程序员」和「服务器」之间的通信软件. http://sc.ftqq.com/3. ...

  9. CentOS7开放端口号

    查看所有开放的端口号 firewall-cmd --zone=public --list-ports 或者 firewall-cmd --permanent --list-ports(--perman ...

  10. iOS项目之使用开关控制日志输出的功能

    最近一直在做sdk的项目,用户提出了一个需求,需要屏蔽sdk内部的日志输出.由于sdk内部的日志是为了调试,如果屏蔽了肯定不方便,所以研究了一下日志输出开关的功能. 在这里介绍两种实现方案:一种方案是 ...