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 ...
随机推荐
- MIPI-Layout说明(转载)
转载于:http://www.ccm99.com/thread-3713-1-1.html 前言:随着新的总线协议不断提高信号速率,如今的PCB 设计人员需要充分理解高速布线的要求并控制PCB 走线的 ...
- Centos7安装net Core
官方文档:https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/install 我这里是物理机,不是虚拟机 第一步: sudo ...
- PHP----------一群猴子排成一圈,按1,2,...,n依次编号。
1.一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去, 直到最后只剩下一只猴子为止,那 ...
- 第九届蓝桥杯C/C++B组省赛感想
因为做了近三年的初赛题,都对了5题+,所以这次比赛前信心满满,心里想最少水个省二没问题.可我怎么知道今年的套路居然和以前不一样了!一题深搜都没有,想想一周前做的第七届初赛题,10题有3.4题深搜题. ...
- mvc partialView+kendo window
在写mvc项目时,一个列表查询页面含有多个操作按钮及弹框操作.原本写在了一个view中,导致代码繁多复杂,难以维护,还有表单赋值清空.验证等麻烦. 因此改用kendo window +partialV ...
- html5 css练习浮动布局
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- document.wrtie()用法
推荐看这篇文章,非常的好 http://www.softwhy.com/article-8326-1.html
- Java-对象及变量的并发访问小结
1)多线程环境下,方法内的变量是线程安全的 2)多个线程同时处理一个实例,这个实例内的变量是不安全的 3)不同线程中注入同一个类的不同实例,实例中的变量是安全的 4)Synchronized获取到的锁 ...
- Linux基础命令---tload显示系统负载
tload tload指令以字符的方式显示当前系统的平均负载情况. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.SUSE.openSUSE. 1.语法 ...
- Java第一次实训课
//1.1 声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. package mingye; public class Exc { public static voi ...