博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#操作Control异步工具类
阅读量:6267 次
发布时间:2019-06-22

本文共 3767 字,大约阅读时间需要 12 分钟。

///     /// 异步工具类    ///     public class TaskTools    {        ///         /// 是否 在执行回调函数之前修改Running状态        ///         public bool ChangeRunningStateBeforeCallback { get; private set; }        ///         /// 是否 正在执行异步任务        ///         public bool Running { get; private set; }        public TaskTools()            : this(false)        {        }        ///         ///         ///         /// 是否 在执行回调函数之前修改Running状态 默认值false        public TaskTools(bool changeRunningStateBeforeCallback)        {            this.ChangeRunningStateBeforeCallback = changeRunningStateBeforeCallback;        }        ///         /// 执行异步任务        ///         /// 
异步任务返回值类型
/// 操作UI时需要Invoke的控件 /// 将要执行的任务任务 /// 异步任务执行完毕后执行的回调函数 public void Run
(Control control, Func
asyncFunc, Action
callback) { if (this.Running) throw new InvalidOperationException(" the task is running "); try { this.Running = true; Task
task = new Task
(() => { try { return asyncFunc(); } catch (Exception ex) { Console.WriteLine(ex.Message); return default(T); } }); task.Start(); TaskContinue
(control, task, callback); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { this.Running = false; } } ///
/// 执行异步任务 /// ///
异步任务返回值类型
///
操作UI时需要Invoke的控件 ///
异步任务的传入参数 ///
将要执行的任务任务 ///
异步任务执行完毕后执行的回调函数 public void Run
(Control control, object args, Func
asyncFunc, Action
callback) { if (this.Running) throw new InvalidOperationException(" the task is running "); try { this.Running = true; Task
task = new Task
((lambdaObj) => { try { return asyncFunc(lambdaObj); } catch (Exception ex) { Console.WriteLine(ex.Message); return default(T); } }, args); task.Start(); TaskContinue
(control, task, callback); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { this.Running = false; } } ///
/// 延时执行某任务 /// ///
操作UI时需要Invoke的控件 ///
将要延时执行的毫秒数 ///
异步任务执行完毕后执行的回调函数 public void DelayedRun(int milliSecond, Control control, Action callback) { this.Run
(control, () => { Thread.Sleep(milliSecond); // 4.0 类库 return milliSecond; }, (time) => { callback(); }); } ///
/// Control.Invoke方法的简易封装 /// ///
参数类型
///
///
///
public static void ControlInvoke
(Control control, T args, Action
action) { try { Invoke
(control, args, action); } catch (Exception ex) { Console.WriteLine(ex.Message); } } ///
/// 异步任务完成后继续执行... /// ///
///
///
///
private void TaskContinue
(Control control, Task
task, Action
callback) { task.ContinueWith((lambdaAction) => { if (this.ChangeRunningStateBeforeCallback) { this.Running = false; } try { if (callback != null) { // 有UI控件 则将回调函数 注入到UI控件的相关线程中去执行 if (control != null) { TaskTools.Invoke
(control, lambdaAction.Result, callback); } else { // 否则在当前线程内执行 回调函数 callback(lambdaAction.Result); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { this.Running = false; } }); } ///
/// Control.Invoke方法的简易封装 /// 注意 无 Try Catch /// ///
参数类型
///
///
///
private static void Invoke
(Control control, T args, Action
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); } } }

  

转载于:https://www.cnblogs.com/XuPengLB/p/9685801.html

你可能感兴趣的文章
DHCP 日志分析
查看>>
.NET Micro Framework动态调用C/C++底层代码(原理篇)
查看>>
Windows Server 2012正式版RDS系列⒃
查看>>
Shell脚本之awk篇
查看>>
微软发布Azure Stack硬件需求
查看>>
python socket编程详细介绍
查看>>
Windows Server 2016第三个技术预览版新技术
查看>>
Everything 本地磁盘文件搜索工具下载!
查看>>
Python dict(字典) 详细总结
查看>>
RPF(Reverse Path Forwarding 反向路径转发)技术
查看>>
2016年收到的第一件礼物,被评上微软全球最有价值专家MVP(一)
查看>>
2016中国VR开发者论坛第一期
查看>>
Hyper-V 2016 系列教程5 Hyper-V 服务器基本属性
查看>>
北京、天津工厂自动监测数据爬取
查看>>
第一个python程序简单加法计算器
查看>>
在CentOS下安装Tomcat8
查看>>
Weblogic classloader分析
查看>>
做技术做软件-----如何才能拿到上万的月薪
查看>>
linux 查看当前路径命令:pwd
查看>>
At.js – 用于 Web 应用程序的自动完成库
查看>>