/// <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异步工具类的更多相关文章

  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. (2.1)mysql升级与降级

    (2.1)mysql升级与降级 转自:深入浅出mysql数据库开发.优化与管理第二版 1.mysql升级 2.mysql降级

  2. python tkinter entry

    """小白随笔,大佬勿喷""" '''Entry编辑框 收集数据''' import tkinter as tk import tkinte ...

  3. abap 变量检查

    1:sap logon中可以对变量命名进行检查 program>check>code inspector

  4. PHP防CC攻击代码

    PHP防CC攻击代码: empty($_SERVER['HTTP_VIA']) or exit('Access Denied'); //代理IP直接退出 session_start(); $secon ...

  5. C语言之指针若干问题

    1.指针变量的赋值问题. 常常有偷懒的小伙子,这样赋值 int *Pointer =  3:/ 这是给Pointer 所指的变量赋值,刚创建Pointer时,它所指的变量是不固定的,可能是某个重要的系 ...

  6. spring-springmvc-jdbc小案例

    此案例是为ssm作铺垫的. 创建一个银行账户和基金账户,然后通过银行账户购买基金.由spring.springmvc.spring自带的c3p0实现. 废话不多说.如下 涉及到的 jar包(多了): ...

  7. 五、latex文档的篇章结构

  8. js某一元素在数组中的索引

    第一种:数组遍历 function search(arr,dst){ var i = arr.length; while(i-=1){ if (arr[i] == dst){ return i; } ...

  9. JDK1.8 HashMap--treeifyBin()方法

    /*树形化*/ final void treeifyBin(Node<K,V>[] tab, int hash) { int n, index; Node<K,V> e;// ...

  10. python爬虫简单的添加代理进行访问

    在使用python对网页进行多次快速爬取的时候,访问次数过于频繁,服务器不会考虑User-Agent的信息,会直接把你视为爬虫,从而过滤掉,拒绝你的访问,在这种时候就需要设置代理,我们可以给proxi ...