当前位置: 首页 > news >正文

请被人做网站平面素材网

请被人做网站,平面素材网,wordpress 标签链接,仿淘宝网站源码+phpWinform 进度条弹窗和任务控制目录Winform 进度条弹窗和任务控制一、弹窗前台二、弹窗后台三、使用方法四、效果展示和代码地址独立观察员 2020 年 11 月 17 日最近要给一个 Winform 项目添加功能#xff0c;需要一个能显示进度条的弹窗#xff0c;还要求能够中止任务#x… Winform 进度条弹窗和任务控制目录Winform 进度条弹窗和任务控制一、弹窗前台二、弹窗后台三、使用方法四、效果展示和代码地址独立观察员 2020 年 11 月 17 日 最近要给一个 Winform 项目添加功能需要一个能显示进度条的弹窗还要求能够中止任务所以就做了一个在此做个记录总结。虽然用的是比较老的 Winform 技术不过其中的原理都是相通的。 一、弹窗前台首先提供一个 Winform 控件居中的小技巧将控件放在 TableLayoutPanel 容器中然后将控件的 Anchor 属性设置为 None这样控件就能在容器中居中了 将容器的 Anchor 属性设置为 Top, Left, Right这样容器就能随着窗口左右拉伸了 最终弹窗界面如下 使用了 CSkin 界面库v16.1.14.3注意如果拖拽 dll 到工具箱拖不了可以使用右键复制粘贴的方式窗体继承 Skin_DevExpress进度条使用 SkinProgressBar按钮使用 SkinButton主要是使用了一些圆角效果 二、弹窗后台先添加两个事件供外界订阅分别为窗体载入时触发的执行操作事件和点击中止按钮后触发的终止操作事件/// summary /// 执行操作事件 /// /summary public event Action OperateAction;/// summary /// 终止操作事件 /// /summary public event Action AbortAction;/// summary /// 中止按钮点击事件 /// /summary private void btn_Abort_Click(object sender, EventArgs e) {AbortAction?.Invoke();DialogResult DialogResult.Abort;//Close (); // 不需要手动关闭 }/// summary /// 窗体载入事件 /// /summary private void FormProgressDialog_Load(object sender, EventArgs e) {Task.Factory.StartNew(() {OperateAction?.Invoke();DialogResult DialogResult.OK;}); }点击中止按钮后还将弹窗结果设为 Abort会自动关闭弹窗而业务操作正常执行完毕弹窗结果为 OK。 供外界设置文本信息以及进度条进度的方法如下/// summary /// 设置显示信息 (值为 null 时保持不变) /// /summary /// param namertfTitleContent 富文本格式的标题内容 /param /// param nametotalMessage 总体消息 /param /// param namecurrentMessage 当前消息 /param public void SetInfo(string rtfTitleContent null, string totalMessage null, string currentMessage null) {if (rtfTitleContent ! null) rtb_Title.Rtf rtfTitleContent;if (totalMessage ! null) lbl_Total.Text totalMessage;if (currentMessage ! null) lbl_Current.Text currentMessage; }/// summary /// 设置进度 /// /summary /// param namecurrentValue 当前数值 /param /// param nametotalValue 总数值 /param public void SetProsess(double currentValue, double totalValue) {try{progressBar.Value (int)(currentValue / totalValue * 100);}catch (Exception ex){Console.WriteLine(ex);} }剩下就是两个设置富文本框 RichTextBox 的方法包括设置彩色内容和隐藏 RichTextBox 光标的方法文末会给出代码地址此处不再赘述。 三、使用方法首先映入眼帘的是两个成员变量一个是用于任务取消的 CancellationTokenSource 对象另一个是用于线程同步的 AutoResetEvent 对象用于取消任务后的一些信息同步然后是主测试方法一个按钮点击事件方法中的一些信息设置 然后设置 CancellationTokenSource 对象的 Token给它注册一个取消任务时调用的委托方法里面先等待同步信号结果再进行本次执行结果的判断 接下来订阅弹窗中的那两个事件在执行操作事件中开启任务并传递 Token在中止事件中停止任务 需要注意的是停止任务后任务内部并不会自己停止需要判断 Token 的 IsCancellationRequested 字段来决定相应的操作比如结束循环。然后因为在之前注册的取消的委托方法中进行了等待所以我们在执行完业务方法BusinessMethod并设置好相关状态值后需要判断任务是否取消如果取消说明注册的取消的委托方法中已经在等待了所以要调用 Set () 进行放行。 有人可能就会问了foreach 循环开始时不是判断过是否取消了吗这里怎么又判断这是因为比如在一轮循环中已经执行过了开头的是否已取消的判断IsCancellationRequested 为 false开始执行耗时的业务方法了此时用户点击中止按钮IsCancellationRequested 被置为 true所以业务方法执行后再次判断会得到最新的状态然后循环将在下一轮开始时结束。 另外由于实际使用这个的项目是 .NET 4.0 框架所以 Task 的一些方法没有大家用新框架的话可以使用新方法。或者使用 Microsoft.Bcl.Async 包然后使用 TaskEx。 继续流程接下来以模态框方式弹出窗口并获取结果。业务处理方法中模拟了耗时操作并返回是否成功。 最后给出完整代码#region 测试任务进度条弹窗private CancellationTokenSource _Cts; // 任务取消令牌 private AutoResetEvent _AutoResetEvent new AutoResetEvent(false);// 参数传 false则 WaitOne 时阻塞等待/// summary /// 测试任务进度弹窗 /// /summary private void BtnProgressDialog_Click(object sender, EventArgs e) {_AutoResetEvent.Reset();string businessName 业务 1;FormProgressDialog progressWindow new FormProgressDialog(){Text 任务处理窗口,};progressWindow.SetColorfulTitle(业务 1, Color.DarkOrange, true);progressWindow.SetColorfulTitle(正在执行中......, Color.Black);progressWindow.SetInfo(null, , );Liststring orders new Liststring(){订单 1, 订单 2, 订单 3, 订单 4, 订单 5 }; // 业务数据Liststring leftList orders.Select(x x).ToList(); // 剩余未处理数据int successCount 0; // 成功数量_Cts new CancellationTokenSource();// 注册一个将在取消此 CancellationToken 时调用的委托_Cts.Token.Register(async () {ShowInfo(操作终止);await Task.Run(() {_AutoResetEvent.WaitOne(1000 * 5); // 等待有可能还在执行的业务方法if (successCount orders.Count){ShowInfo(${businessName} 有 {orders.Count - successCount} 项任务被终止可在消息框中查看具体项。);foreach (var leftName in leftList){ShowInfo($【{businessName}】的【{leftName}】执行失败失败原因【手动终止】。);}}});});progressWindow.OperateAction () {Task task new Task(() {foreach (var order in orders){// 判断是否被取消if (_Cts.Token.IsCancellationRequested){break;}progressWindow.TryBeginInvoke(new Action(() {progressWindow.SetInfo(null, $ 共 {orders.Count} 项已执行 {successCount} 项 , $ 当前正在执行{order});}));if (BusinessMethod(order, businessName)){successCount;leftList.RemoveAll(x x order);if (_Cts.Token.IsCancellationRequested){_AutoResetEvent.Set(); // 放行 Register 委托处的等待}}progressWindow.TryBeginInvoke(new Action(() {progressWindow.SetProsess(orders.IndexOf(order) 1, orders.Count);}));}}, _Cts.Token);task.Start();task.Wait();};progressWindow.AbortAction () {_Cts.Cancel();};var result progressWindow.ShowDialog();int leftCount orders.Count - successCount;if (result DialogResult.OK || leftCount 0){ShowInfo(${businessName} 整体完成。);}else if (result DialogResult.Abort){// 移到 _Cts.Token.Register 处一起判断不然数目可能不准//ShowInfo (${businessName} 有 {leftCount} 项任务被终止可在消息框中查看具体项。);} }/// summary /// 业务处理方法 /// /summary private bool BusinessMethod(string order, string businessName) {string errStr $【{businessName}】的 {order} 任务失败失败原因;// 测试Thread.Sleep(1000 * 2);try{// 业务方法ShowInfo($【{businessName}】的 {order} 任务执行成功。);return true;}catch (Exception ex){ShowInfo(${errStr}{ex.Message});}return false; }#endregion四、效果展示和代码地址正常执行动图 中止执行动图 代码地址https://gitee.com/dlgcy/Practice/tree/master/WinFormPractice
http://www.sadfv.cn/news/54293/

相关文章:

  • 织梦网站修改教程视频上海十大建筑设计公司
  • 爱唐山做贡献月评十佳投票网站直接做的视频网站
  • 阳西县住房和城乡建设部网站wordpress超级大菜单如何使用
  • 数码网站建设维护大型网站建设报价
  • html5 服装网站新建的网站百度多久才会收录
  • 高效网站推广费用软件开发公司简介模板免费
  • 绍兴做网站建设重庆属于哪个省
  • 网站换服务器怎么做备份网站建设中的主要功能
  • 假网站连接怎么做的网站首页设计收费
  • 国外设计网站欣赏网页特效代码网站
  • 织梦做的网站用什么数据库微信小程序原生开发
  • 网站开发vs平台的功能试用网建设网站
  • 网站渠道建设万网域名指向网站
  • 简洁网站模板素材招聘网站的建设
  • wordpress一个主站多个子站12380网站建设意见
  • 凡科做的微网站怎样连接公众号wordpress插件去掉广告
  • 门户网站制作建设wordpress 验证账号
  • 网站建设动态代码上海优化seo排名
  • 诸暨 外贸网站建设做旅游游客产品的网站
  • 寿县网站建设环球军事最新消息
  • 室内设计师个人网站国际热点新闻
  • 织梦做的网站网易企业邮箱注册流程
  • 网站建设页面设计图片杭州网站建设官方蓝韵网络
  • 登封做网站推广wordpress头像旋转
  • 国内设计网站公司设计网装修
  • 网站设计的研究方法网络营销的类型
  • 万网有网站建设吗做网站什么职业
  • 哈尔滨建站wordpress 添加导航
  • 在线营销网站建设长沙市网站推广电话
  • ipv6域名解析 做网站wordpress的模板是什么