Exemple #1
0
        public static void 异步执行(Control __影响区域, Action __异步任务, Action __成功后执行 = null, Action <Exception> __失败后执行 = null, bool __禁用影响区域 = true)
        {
            //获取并验证输入

            //限制界面
            var __等待面板 = new F等待();

            __影响区域.创建局部覆盖控件(__等待面板, null, __禁用影响区域);

            //配置任务
            var __任务 = new Task(() =>
            {
                var __停留最小间隔 = 500;
                var __计时器    = new System.Diagnostics.Stopwatch();
                __计时器.Start();
                __异步任务();
                __计时器.Stop();
                if (__计时器.ElapsedMilliseconds < __停留最小间隔)
                {
                    Thread.Sleep((int)(__停留最小间隔 - __计时器.ElapsedMilliseconds));
                }
            });

            //反馈操作结果
            __任务.ContinueWith(task =>
            {
                __等待面板.隐藏();
                __成功后执行?.Invoke();
            },
                              CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
            __任务.ContinueWith(task =>
            {
                __等待面板.隐藏();
                task.Exception.Handle(q => true);
                if (task.Exception.InnerException == null)
                {
                    H日志.记录异常(task.Exception);
                    return;
                }
                if (__失败后执行 != null)
                {
                    __失败后执行(task.Exception.InnerException);
                }
                else
                {
                    new F对话框_确定("执行出错!\r\n" + task.Exception.InnerException.Message, "").ShowDialog();
                    H日志.记录异常(task.Exception);
                }
            },
                              CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());

            //开始任务
            __任务.Start();
        }
Exemple #2
0
        public static void  步执行(Control __影响区域, Action __同步任务, bool __禁用影响区域 = false, bool __全覆盖 = false)
        {
            var __等待窗口 = new F等待();

            if (__全覆盖)
            {
                __等待窗口.背景颜色 = __影响区域.BackColor;
                __影响区域.创建全覆盖控件(__等待窗口, null);
                __等待窗口.居中();
            }
            else
            {
                __影响区域.创建局部覆盖控件(__等待窗口, null, __禁用影响区域);
            }
            try
            {
                __同步任务();
            }
            finally
            {
                __等待窗口.隐藏();
            }
        }