/// <summary> /// 执行异步委托 /// </summary> /// <param name="asynWaitPara">异步等待执行参数</param> /// <param name="containerControl">容器控件</param> public override void Excute(PartAsynWaitPara <T, TResult> asynWaitPara, TContainer containerControl) { if (asynWaitPara.AsynWait == null) { PartAsynUIParaProxy.SetAsynWait(asynWaitPara, this.CreateAsynWaitShadeControl(_shadeType, asynWaitPara)); } if (asynWaitPara.Islock) { return; } lock (asynWaitPara.SyncRoot) { if (asynWaitPara.Islock) { return; } PartAsynUIParaProxy.Lock(asynWaitPara); } var container = containerControl as Control; this._asynWaitPara = asynWaitPara; this._containerControl = container; WinformPartAsynExcuteHelper.DisableControls(container, this._asynModifyControls); //设置遮罩层控件 asynWaitPara.AsynWait.ShadeBackground = PartAsynExcuteFactoryWinform.ConvertShadeBackground(asynWaitPara.AsynWaitBackground); this.SetShadeControl(container, (Control)asynWaitPara.AsynWait); //启动执行线程 base.StartAsynExcuteThread(); }
private void tsmiGenerateModel_Click(object sender, EventArgs e) { var tableInfoArr = this._tableList.Where(t => { return(t.ShowField); }).ToArray(); if (tableInfoArr.Length == 0) { return; } var frm = new FModelInfo(); if (frm.ShowDialog() != DialogResult.OK) { return; } var para = new PartAsynWaitPara <Tuple <string, string, string, DBTableInfoEx[]>, object>(); para.Caption = "生成model结构"; para.IsShowCancel = false; para.Para = new Tuple <string, string, string, DBTableInfoEx[]>(frm.Namespace, frm.BaseClassName, frm.Dir, tableInfoArr); para.Function = this.GenerateModel; para.Completed = (ret) => { if (ret.Status == PartAsynExcuteStatus.Exception) { Loger.Error(ret.Exception); } }; PartAsynWaitHelper.Wait(para, this); }
/// <summary> /// 异步等待 /// </summary> /// <typeparam name="T">异步执行参数类型</typeparam> /// <typeparam name="TResult">异步执行返回值类型</typeparam> ///<param name="asynWaitPara">异步等待执行参数</param> ///<param name="containerControl">容器控件</param> ///<param name="asynWait">异步等待UI</param> public static void Wait <T, TResult>(PartAsynWaitPara <T, TResult> asynWaitPara, System.Windows.Controls.Panel containerControl, IPartAsynWait asynWait) { ParaValidate(asynWaitPara, containerControl); var asynExcute = _partAsynExcuteFactory.CreateExcute <T, System.Windows.Controls.Panel, TResult>(); PartAsynUIParaProxy.SetAsynWait(asynWaitPara, asynWait); asynExcute.Excute(asynWaitPara, containerControl); }
/// <summary> /// 异步等待 /// </summary> /// <typeparam name="T">异步执行参数类型</typeparam> /// <typeparam name="TResult">异步执行返回值类型</typeparam> ///<param name="asynWaitPara">异步等待执行参数</param> ///<param name="containerControl">容器控件</param> ///<param name="asynWait">异步等待UI</param> ///<param name="hasWinformControl">容器控件中是否含有Winform的子控件[true:有;false:没有]</param> public static void Wait <T, TResult>(PartAsynWaitPara <T, TResult> asynWaitPara, UIElement containerControl, IPartAsynWait asynWait, bool hasWinformControl = false) { ParaValidate(asynWaitPara, containerControl); var asynExcute = (WPFAsynExcuteAbs <T, UIElement, TResult>)_partAsynExcuteFactory.CreateExcute <T, UIElement, TResult>(); asynExcute.HasWinformControl = hasWinformControl; PartAsynUIParaProxy.SetAsynWait(asynWaitPara, asynWait); asynExcute.Excute(asynWaitPara, containerControl); }
private void TestAsynWait() { var para = new PartAsynWaitPara <int, string>(); para.Para = 100; para.Title = "测试这个控件"; para.Function = (inp) => { for (int i = 0; i < inp.Para; i++) { inp.AsynWait.Message = string.Format("正在处理:{0}项..", i); Thread.Sleep(500); if (inp.Token.IsCancellationRequested) { break; } //if (i > 5) //{ // throw new NotSupportedException("XXX"); //} } return("OK"); }; para.ShowCancel = true; para.AsynWaitBackground = Brushes.Red; para.Completed = (p) => { string str; switch (p.Status) { case PartAsynExcuteStatus.Completed: str = p.Result; break; case PartAsynExcuteStatus.Exception: str = p.Exception.Message; break; case PartAsynExcuteStatus.Cancel: str = "Cancel"; break; default: str = "none"; break; } MessageBox.Show(str); }; WPFPartAsynWaitHelper.Wait(para, this); }
/// <summary> /// 异步等待 /// </summary> /// <typeparam name="T">异步执行参数类型</typeparam> /// <typeparam name="TContainer">容器控件类型</typeparam> /// <typeparam name="TResult">异步执行返回值类型</typeparam> ///<param name="asynWaitPara">异步等待执行参数</param> ///<param name="containerControl">容器控件</param> ///<param name="asynWait">异步等待UI</param> ///<param name="asynExcute">异步执行</param> public static void Wait <T, TContainer, TResult>(PartAsynWaitPara <T, TResult> asynWaitPara, TContainer containerControl, IPartAsynWait asynWait, IAsynExcute <T, TContainer, TResult> asynExcute) { ParaValidate(asynWaitPara, containerControl); if (asynExcute == null) { throw new ArgumentNullException("asynExcute"); } asynWaitPara.AsynWait = asynWait; asynExcute.Excute(asynWaitPara, containerControl); }
private void btnTestAsynWait_Click(object sender, EventArgs e) { var para = new PartAsynWaitPara <int, string>(); para.Para = 10; para.Function = (inp) => { for (int i = 0; i < inp.Para; i++) { inp.AsynWait.Message = string.Format("正在处理:{0}项..", i); Thread.Sleep(500); if (inp.Token.IsCancellationRequested) { break; } if (i > 5) { throw new NotSupportedException("XXX"); } } return("OK"); }; para.ShowCancel = true; para.AsynWaitBackground = Color.Red; para.Completed = (p) => { string str; switch (p.Status) { case PartAsynExcuteStatus.Completed: str = p.Result; break; case PartAsynExcuteStatus.Exception: str = p.Exception.Message; break; case PartAsynExcuteStatus.Cancel: str = "Cancel"; break; default: str = "none"; break; } MessageBox.Show(this, str); }; WinformPartAsynWaitHelper.Wait(para, this); }
/// <summary> /// 参数验证 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="asynWaitPara"></param> /// <param name="containerControl"></param> protected static void ParaValidate <T, TResult>(PartAsynWaitPara <T, TResult> asynWaitPara, object containerControl) { if (asynWaitPara == null) { throw new ArgumentNullException("asynWaitPara"); } if (containerControl == null) { throw new ArgumentNullException("containerControl"); } }
/// <summary> /// 执行异步委托 /// </summary> /// <param name="asynWaitPara">异步等待执行参数</param> /// <param name="containerControl">容器控件</param> public override void Excute(PartAsynWaitPara <T, TResult> asynWaitPara, TContainer containerControl) { if (asynWaitPara.AsynWait == null) { PartAsynUIParaProxy.SetAsynWait(asynWaitPara, this.CreateAsynWaitShadeControl(_shadeType, asynWaitPara)); } if (asynWaitPara.Islock) { return; } lock (asynWaitPara.SyncRoot) { if (asynWaitPara.Islock) { return; } PartAsynUIParaProxy.Lock(asynWaitPara); } var container = containerControl as Control; this._asynWaitPara = asynWaitPara; this._containerControl = container; //设置遮罩层控件 asynWaitPara.AsynWait.ShadeBackground = PartAsynExcuteFactoryWinform.ConvertShadeBackground(asynWaitPara.AsynWaitBackground); //添加遮罩层控件 this._shadeControl = new UtilZ.Dotnet.WindowsDesktopEx.Winform.Controls.OpacityPanel(); this._shadeControl.Dock = DockStyle.Fill; container.Controls.Add(this._shadeControl); container.Controls.SetChildIndex(this._shadeControl, 0); var asynWaitControl = (Control)asynWaitPara.AsynWait; asynWaitControl.Anchor = AnchorStyles.None; asynWaitControl.Location = new System.Drawing.Point((container.Width - asynWaitControl.Width) / 2, (container.Height - asynWaitControl.Height) / 2); container.Controls.Add(asynWaitControl); container.Controls.SetChildIndex(asynWaitControl, 0); //禁用容器控件内的子控件的Tab焦点选中功能 WinformPartAsynExcuteHelper.DisableTab(container, this._asynModifyControls); //启动执行线程 base.StartAsynExcuteThread(); }
/// <summary> /// 取消一个异常等待 /// </summary> /// <param name="asynWaitPara">异步等待参数</param> public static void Cancel <T, TResult>(PartAsynWaitPara <T, TResult> asynWaitPara) { if (asynWaitPara == null) { return; } var asynWait = asynWaitPara.AsynWait; if (asynWait == null) { return; } asynWait.Cancel(); }
/// <summary> /// 执行异步委托 /// </summary> /// <param name="asynWaitPara">异步等待执行参数</param> /// <param name="containerControl">容器控件</param> public override void Excute(PartAsynWaitPara <T, TResult> asynWaitPara, TContainer containerControl) { if (asynWaitPara.AsynWait == null) { PartAsynUIParaProxy.SetAsynWait(asynWaitPara, this.CreateAsynWaitShadeControl(_shadeType, asynWaitPara)); } if (asynWaitPara.Islock) { return; } lock (asynWaitPara.SyncRoot) { if (asynWaitPara.Islock) { return; } PartAsynUIParaProxy.Lock(asynWaitPara); } var container = containerControl as Control; this._asynWaitPara = asynWaitPara; this._containerControl = container; //禁用容器控件内的子控件的Tab焦点选中功能 WinformPartAsynExcuteHelper.DisableTab(container, this._asynModifyControls); //设置遮罩层控件 asynWaitPara.AsynWait.ShadeBackground = PartAsynExcuteFactoryWinform.ConvertShadeBackground(asynWaitPara.AsynWaitBackground); //添加遮罩层控件 var shadeControl = (Control)asynWaitPara.AsynWait; shadeControl.Dock = DockStyle.Fill; this.SetShadeBackgroundImg(container, shadeControl); container.Controls.Add(shadeControl); //设置遮罩层控件在最上层 container.Controls.SetChildIndex(shadeControl, 0); container.SizeChanged += containerControl_SizeChanged; //启动执行线程 base.StartAsynExcuteThread(); }
private void btnLoad_Click(object sender, EventArgs e) { try { var dbConfig = DropdownBoxHelper.GetGenericFromComboBox <DatabaseConfig>(comboBoxDB); var para = new PartAsynWaitPara <DatabaseConfig, object>(); para.Caption = "查询数据库结构"; para.IsShowCancel = false; para.Para = dbConfig; para.Function = (p) => { p.AsynWait.Hint = $"正在查询数据库[{dbConfig.ConName}]结构,请稍候..."; IDBAccess dbAccess = DBAccessManager.GetDBAccessInstance(p.Para.DBID); this._tableList = dbAccess.Database.GetTableInfoList(true).OrderBy(t => { return(t.Name); }).Select(t => { return(new DBTableInfoEx(t)); }).ToList(); if (p.AsynWait.InvokeRequired) { p.AsynWait.Invoke(new Action(() => { this._tableBindingList.Clear(); this._tableBindingList.AddRange(this._tableList); })); } else { this._tableBindingList.Clear(); this._tableBindingList.AddRange(this._tableList); } return(null); }; para.Completed = (ret) => { if (ret.Status == PartAsynExcuteStatus.Exception) { Loger.Error(ret.Exception); } }; PartAsynWaitHelper.Wait(para, this); } catch (Exception ex) { Loger.Error(ex); MessageBox.Show(ex.Message); } }
/// <summary> /// 执行异步委托 /// </summary> /// <param name="asynWaitPara">异步等待执行参数</param> /// <param name="containerControl">容器控件</param> public override void Excute(PartAsynWaitPara <T, TResult> asynWaitPara, TContainer containerControl) { if (asynWaitPara.AsynWait == null) { PartAsynUIParaProxy.SetAsynWait(asynWaitPara, this.CreateAsynWaitShadeControl(_shadeType, asynWaitPara)); } var container = containerControl as UIElement; if (container == null) { throw new ArgumentException($"容器元素类型{containerControl.GetType().FullName}不是{typeof(UIElement).FullName}子类"); } if (asynWaitPara.Islock) { return; } lock (asynWaitPara.SyncRoot) { if (asynWaitPara.Islock) { return; } PartAsynUIParaProxy.Lock(asynWaitPara); } this._asynWaitPara = asynWaitPara; //设置遮罩层控件 asynWaitPara.AsynWait.ShadeBackground = PartAsynExcuteFactoryWPF.ConvertShadeBackground(asynWaitPara.AsynWaitBackground); this.AddAsynWaitControl((FrameworkElement)asynWaitPara.AsynWait, container); //启动执行线程 base.StartAsynExcuteThread(); }
/// <summary> /// 异步等待 /// </summary> /// <typeparam name="T">异步执行参数类型</typeparam> /// <typeparam name="TResult">异步执行返回值类型</typeparam> ///<param name="asynWaitPara">异步等待执行参数</param> ///<param name="containerControl">容器控件</param> public static void Wait <T, TResult>(PartAsynWaitPara <T, TResult> asynWaitPara, System.Windows.Controls.Panel containerControl) { Wait <T, TResult>(asynWaitPara, containerControl, null); }
private void TestAsynWait(UIElement container) { var para = new PartAsynWaitPara <int, string>(); para.Para = 100; para.Title = "测试这个控件"; para.Function = (inp) => { try { for (int i = 0; i < inp.Para; i++) { inp.AsynWait.Message = string.Format("正在处理:{0}项..", i); Thread.Sleep(2000); inp.Token.ThrowIfCancellationRequested(); //if (inp.Token.IsCancellationRequested) //{ // break; //} //if (i > 5) //{ // throw new NotSupportedException("XXX"); //} } return("OK"); } catch (OperationCanceledException) { return("OperationCanceledException"); } }; para.ShowCancel = true; para.ImmediatelyCompleted = false; //para.AsynWaitBackground = Brushes.Red; para.Completed = (p) => { string str; switch (p.Status) { case PartAsynExcuteStatus.Completed: str = p.Result; break; case PartAsynExcuteStatus.Exception: str = p.Exception.Message; break; case PartAsynExcuteStatus.Cancel: str = p.Result + "_Cancel"; break; default: str = "none"; break; } MessageBox.Show(this, str); }; //WPFPartAsynWaitHelper.Wait(para, this.grid); WPFPartAsynWaitHelper.Wait(para, container, true); }
/// <summary> /// 异步等待 /// </summary> /// <typeparam name="T">异步执行参数类型</typeparam> /// <typeparam name="TResult">异步执行返回值类型</typeparam> ///<param name="asynWaitPara">异步等待执行参数</param> ///<param name="containerControl">容器控件</param> ///<param name="hasWinformControl">容器控件中是否含有Winform的子控件[true:有;false:没有]</param> public static void Wait <T, TResult>(PartAsynWaitPara <T, TResult> asynWaitPara, UIElement containerControl, bool hasWinformControl = false) { Wait <T, TResult>(asynWaitPara, containerControl, null, hasWinformControl); }
/// <summary> /// 异步等待 /// </summary> /// <typeparam name="T">异步执行参数类型</typeparam> /// <typeparam name="TContainer">容器控件类型</typeparam> /// <typeparam name="TResult">异步执行返回值类型</typeparam> ///<param name="asynWaitPara">异步等待执行参数</param> ///<param name="containerControl">容器控件</param> ///<param name="asynExcute">异步等待UI</param> public static void Wait <T, TContainer, TResult>(PartAsynWaitPara <T, TResult> asynWaitPara, TContainer containerControl, IAsynExcute <T, TContainer, TResult> asynExcute) { Wait <T, TContainer, TResult>(asynWaitPara, containerControl, null, asynExcute); }