/// <summary> /// 初始化组件并指定等待窗体 /// </summary> /// <param name="fmWait">等待窗体</param> public BackgroundWorkerUI(IWaitForm fmWait) { if (fmWait == null) { throw new ArgumentNullException(); } _waitForm = fmWait; }
/// <summary> /// 执行委托并显示自定义等候窗体 /// </summary> public static object RunDelegate(IWaitForm fmWait, Delegate del, params object[] args) { //利用AutoResetEvent.WaitOne的原子性,防止重入 if (!_areForWhole.WaitOne(0)) { throw new WorkIsBusyException(); } _isRunning = true; try { if (fmWait == null) { throw new ArgumentNullException("fmWait"); } if (del == null || del.GetInvocationList().Length != 1) { throw new ApplicationException("委托不能为空,且只能绑定1个方法!"); } if (args == null) { throw new ArgumentNullException("args"); } Reset(); _waitForm = fmWait;//需在开始异步任务前赋值,因为异步中可能用到 //更新上下文为UI线程上下文,因为如果在Main中Run,先前拿到的上下文也许时null, //会导致在异步完成时用Post关闭窗体抛异常 _waitForm.Shown += (S, E) => _syncContext = SynchronizationContext.Current; StartAsync(del, args); Thread.Sleep(50); //给异步任务一点时间,如果在此时间内完成,就不弹窗 if (!_isCompleted) { //这里有可能出现异步先把wf关了的情况,所以要吃掉这种异常 try { _waitForm.ShowDialog(); } catch (ObjectDisposedException) { } } //返回 if (Cancelled) { throw new WorkCancelledException(); } if (_exception != null) { throw _exception; } return(_result); } finally { Release(); _areForWhole.Set(); _isRunning = false; } }
/// <summary> /// /// </summary> public void CloseSplashScreen() { if (m_waitFormInstance != null && ((Form)m_waitFormInstance).IsDisposed == false) { m_waitFormInstance.CloseWaitForm(); } m_waitFormInstance = null; m_thread = null; }
/// <summary> /// 初始化组件并指定等待窗体 /// </summary> /// <param name="fmWait">等待窗体</param> public BackgroundWorkerUI(IWaitForm fmWait) { if (fmWait == null) { throw new WaitFormNullException(); } waitForm = fmWait; waitForm.UserCancelling += WaitForm_UserCancelling;//注册用户取消任务事件 }
private void InternalShowSplashScreen() { if (m_waitFormInstance == null) { m_waitFormInstance = (IWaitForm)Activator.CreateInstance(m_typeWaitForm); m_waitFormInstance.SetCaption(Caption); m_waitFormInstance.SetDescription(Description); m_waitFormInstance.ShowWaitForm(); } }
/// <summary> /// 释放资源 /// </summary> private static void Release() { Tag = null; _prmsInput = null;//这里不会影响调用者传入的object[]实例,因为不是ref进来的 _prmsMethod = null; //先置null再慢慢dispose,因为方案中多处地方依赖null判断, //就怕判断不为空时正在销毁 var fm = _waitForm; _waitForm = null; fm.Dispose(); }
/// <summary> /// 执行方法并显示自定义等候窗体 /// </summary> public static TResult RunFunc <T1, T2, T3, T4, T5, T6, T7, T8, TResult>(IWaitForm fmWait, Func <T1, T2, T3, T4, T5, T6, T7, T8, TResult> method, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) { return((TResult)RunDelegate(fmWait, method, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)); }
/// <summary> /// 执行方法并显示自定义等候窗体 /// </summary> public static TResult RunFunc <T, TResult>(IWaitForm fmWait, Func <T, TResult> method, T arg) { return((TResult)RunDelegate(fmWait, method, arg)); }
/// <summary> /// 执行方法并显示自定义等候窗体 /// </summary> public static TResult RunFunc <T1, T2, T3, T4, TResult>(IWaitForm fmWait, Func <T1, T2, T3, T4, TResult> method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return((TResult)RunDelegate(fmWait, method, arg1, arg2, arg3, arg4)); }
/// <summary> /// 执行方法并显示自定义等候窗体 /// </summary> public static void RunAction <T1, T2, T3, T4, T5, T6, T7, T8>(IWaitForm fmWait, Action <T1, T2, T3, T4, T5, T6, T7, T8> method, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) { RunDelegate(fmWait, method, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); }
/// <summary> /// 执行方法并显示自定义等候窗体 /// </summary> public static void RunAction <T1, T2, T3, T4, T5>(IWaitForm fmWait, Action <T1, T2, T3, T4, T5> method, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { RunDelegate(fmWait, method, arg1, arg2, arg3, arg4, arg5); }
/// <summary> /// 执行方法并显示自定义等候窗体 /// </summary> public static void RunAction <T1, T2, T3>(IWaitForm fmWait, Action <T1, T2, T3> method, T1 arg1, T2 arg2, T3 arg3) { RunDelegate(fmWait, method, arg1, arg2, arg3); }
/// <summary> /// 执行方法并显示自定义等候窗体 /// </summary> public static void RunAction <T>(IWaitForm fmWait, Action <T> method, T arg) { RunDelegate(fmWait, method, arg); }
/// <summary> /// 执行方法并显示自定义等候窗体 /// </summary> public static void RunAction(IWaitForm fmWait, Action method) { RunDelegate(fmWait, method); }