/// <summary>
 /// 初始化组件并指定等待窗体
 /// </summary>
 /// <param name="fmWait">等待窗体</param>
 public BackgroundWorkerUI(IWaitForm fmWait)
 {
     if (fmWait == null)
     {
         throw new ArgumentNullException();
     }
     _waitForm = fmWait;
 }
Exemple #2
0
        /// <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;
            }
        }
Exemple #3
0
        /// <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;//注册用户取消任务事件
        }
Exemple #5
0
        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();
            }
        }
Exemple #6
0
        /// <summary>
        /// 释放资源
        /// </summary>
        private static void Release()
        {
            Tag         = null;
            _prmsInput  = null;//这里不会影响调用者传入的object[]实例,因为不是ref进来的
            _prmsMethod = null;

            //先置null再慢慢dispose,因为方案中多处地方依赖null判断,
            //就怕判断不为空时正在销毁
            var fm = _waitForm;

            _waitForm = null;
            fm.Dispose();
        }
Exemple #7
0
 /// <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));
 }
Exemple #8
0
 /// <summary>
 /// 执行方法并显示自定义等候窗体
 /// </summary>
 public static TResult RunFunc <T, TResult>(IWaitForm fmWait, Func <T, TResult> method, T arg)
 {
     return((TResult)RunDelegate(fmWait, method, arg));
 }
Exemple #9
0
 /// <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));
 }
Exemple #10
0
 /// <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);
 }
Exemple #11
0
 /// <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);
 }
Exemple #12
0
 /// <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);
 }
Exemple #13
0
 /// <summary>
 /// 执行方法并显示自定义等候窗体
 /// </summary>
 public static void RunAction <T>(IWaitForm fmWait, Action <T> method, T arg)
 {
     RunDelegate(fmWait, method, arg);
 }
Exemple #14
0
 /// <summary>
 /// 执行方法并显示自定义等候窗体
 /// </summary>
 public static void RunAction(IWaitForm fmWait, Action method)
 {
     RunDelegate(fmWait, method);
 }