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); } } }
static void Main(string[] args) { TaskTools task = new TaskTools(true); task.DelayedRun(3000, null, pnlMainFill2); task.DelayedRun(2000, null, () => { pnlMainFill(); //task.DelayedRun(1000, null, () => //{ // pnlMainFill(); //}); }); Console.Read(); }
时间: 2024-10-10 00:22:04