原文:WPF 精修篇 BackgroundWorker

效果


  1. <Grid>
  2. <Grid.RowDefinitions>
  3. <RowDefinition Height="22*"/>
  4. <RowDefinition Height="11*"/>
  5. <RowDefinition Height="47*"/>
  6. </Grid.RowDefinitions>
  7. <StackPanel Orientation="Horizontal" Margin="0,28" VerticalAlignment="Center">
  8. <Label>开始数据</Label>
  9. <TextBox x:Name="beginText" HorizontalAlignment="Left" Height="31" TextWrapping="Wrap" Text="100" VerticalAlignment="Top" Width="100"/>
  10. <Label>结束数据</Label>
  11. <TextBox x:Name="endText" HorizontalAlignment="Left" Height="31" TextWrapping="Wrap" Text="1000000000" VerticalAlignment="Top" Width="100"/>
  12. <Button x:Name="button" Content="开始" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Click="Button_Click"/>
  13. <Button x:Name="Cancel" Content="取消" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Click="Cancel_Click"/>
  14. </StackPanel>
  15. <StackPanel Margin="0" Grid.Row="1" Grid.RowSpan="2">
  16. <TextBlock x:Name="odd" TextWrapping="Wrap" Text="奇数数量:"/>
  17. <TextBlock x:Name="even" TextWrapping="Wrap" Text="偶数数量:"/>
  18. <ProgressBar x:Name="Prebar" Height="20"/>
  19. </StackPanel>
  20. </Grid>

  1. private int oddcount =0;
  2. private int evencount =0;
  3. public void Make(int from ,int to)
  4. {
  5. oddcount = 0;
  6. evencount = 0;
  7. int num = (to - from) / 100;
  8. for (int i = from; i < to; i++)
  9. {
  10. if (worker.CancellationPending == true)
  11. {
  12. return;
  13. }
  14. if (i % 2 == 0)
  15. {
  16. evencount++;
  17. }
  18. else
  19. {
  20. oddcount++;
  21. }
  22. if (i % num == 0 && (worker != null) && (worker.WorkerReportsProgress = true))
  23. {
  24. worker.ReportProgress(i / num);
  25. }
  26. }
  27. }
  28. BackgroundWorker worker = null;
  29. private void Button_Click(object sender, RoutedEventArgs e)
  30. {
  31. int from=0;
  32. int to = 0;
  33. if(int.TryParse(beginText.Text,out from)&&int.TryParse(endText.Text,out to) )
  34. {
  35. button.IsEnabled = false;
  36. odd.Text = "奇数数量:0" ;
  37. even.Text = "偶数数量:0" ;
  38. worker = new BackgroundWorker();
  39. //异步取消 需要增加这个 不然取消失效
  40. worker.WorkerSupportsCancellation = true;
  41. //支持报告进度
  42. worker.WorkerReportsProgress = true;
  43. //注册滚动条事件
  44. worker.ProgressChanged+=worker_ProgressChanged;
  45. //注册任务
  46. worker.DoWork+=worker_DoWork;
  47. //任务完毕触发
  48. worker.RunWorkerCompleted += worker_RunWorkerCompleted;
  49. //给任务传参
  50. worker.RunWorkerAsync(new Tuple<int, int>(from, to));
  51. }
  52. }
  53. private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  54. {
  55. Prebar.Value = e.ProgressPercentage;
  56. }
  57. void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  58. {
  59. // throw new NotImplementedException();
  60. if (sender is BackgroundWorker)
  61. {
  62. if (e.Cancelled == true)
  63. {
  64. odd.Text = "任务已取消";
  65. even.Text = "";
  66. }
  67. else
  68. {
  69. odd.Text = "奇数数量:" + oddcount;
  70. even.Text = "偶数数量:" + evencount;
  71. }
  72. BackgroundWorker k = (BackgroundWorker)sender;
  73. k.DoWork -= worker_DoWork;
  74. k.RunWorkerCompleted -= worker_RunWorkerCompleted;
  75. k = null;
  76. button.IsEnabled = true;
  77. }
  78. }
  79. private void worker_DoWork(object sender, DoWorkEventArgs e)
  80. {
  81. var args = ( Tuple<int, int>)e.Argument;
  82. Make(args.Item1, args.Item2);
  83. if (worker.CancellationPending == true)
  84. {
  85. e.Cancel = true;
  86. }
  87. }
  88. private void Cancel_Click(object sender, RoutedEventArgs e)
  89. {
  90. worker.CancelAsync();
  91. }

WPF 精修篇 BackgroundWorker的更多相关文章

  1. WPF 精修篇 数据触发器

    原文:WPF 精修篇 数据触发器 数据触发器 可以使用Binding 来绑定控件 或者数据源 来触发相关动作 举栗子 <Window.Resources> <Style Target ...

  2. WPF 精修篇 属性触发器

    原文:WPF 精修篇 属性触发器 属性触发器是通过  某个条件触发改变属性 通过无代码实现功能 <Style TargetType="{x:Type Label}"> ...

  3. WPF 精修篇 样式继承

    原文:WPF 精修篇 样式继承 这个 是新知识 样式可以继承 <Style x:Key="TextBlockStyleBase" TargetType="{x:Ty ...

  4. WPF 精修篇 自定义控件

    原文:WPF 精修篇 自定义控件 自定义控件 因为没有办法对界面可视化编辑 所以用来很少 现在实现的是 自定义控件的 自定义属性 和自定义方法 用VS 创建自定义控件后 会自动创建 Themes 文件 ...

  5. WPF 精修篇 用户控件

    原文:WPF 精修篇 用户控件 增加用户控件 数据绑定还是用依赖属性 使用的事件 就委托注册一下 public delegate void ButtonClick(object b,EventArgs ...

  6. WPF 精修篇 DataGrid 筛选

    原文:WPF 精修篇 DataGrid 筛选 DataGrid也可以分组 但是用的地方不多 就没写 筛选还是可以的 比如Datagrid数据量比较大 要做数据筛选 贴码 <DataGrid x: ...

  7. WPF 精修篇 DataGrid 数据源排序

    原文:WPF 精修篇 DataGrid 数据源排序 效果 <DataGrid x:Name="datagrid" ItemsSource="{Binding Ele ...

  8. WPF 精修篇 数据绑定到对象

    原文:WPF 精修篇 数据绑定到对象 数据绑定到对象 首先 我们需要一个对象 public class Preson { private string name; public string Name ...

  9. WPF 精修篇 数据绑定 更新通知

    原文:WPF 精修篇 数据绑定 更新通知 开始更新一点有意思的了 首先 数据绑定  其中之一 Element 绑定 看例子 <Window x:Class="WpfApplicatio ...

随机推荐

  1. poi操作Word创建超链接

    项目引入poi: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ ...

  2. Excel数据导入到Sql server

    问题:数据库内直接操作导致 错误 0xc020901c: 数据流任务 1: 源 - yndata1$.输出[Excel 源输出] 上的 源 - yndata1$.输出[Excel 源输出].列[ind ...

  3. 3-6 merge操作

    In [1]: import pandas as pd In [6]: left =pd.DataFrame({ 'A':['A0','A1','A2','A3'], 'B':['B0','B1',' ...

  4. 5.1 RDD编程

    一.RDD编程基础 1.创建 spark采用textFile()方法来从文件系统中加载数据创建RDD,该方法把文件的URL作为参数,这个URL可以是: 本地文件系统的地址 分布式文件系统HDFS的地址 ...

  5. Deep Q Network(DQN)原理解析

    1. 前言 在前面的章节中我们介绍了时序差分算法(TD)和Q-Learning,当状态和动作空间是离散且维数不高时可使用Q-Table储存每个状态动作对的Q值,而当状态和动作空间是高维连续时,使用Q- ...

  6. 【OI备忘录】dalao博文收藏夹

    [dalao学习笔记总览] [数学] 数论分块:数论分块 矩阵树定理Matrix_Tree:矩阵树Matrix-Tree定理与行列式 杨氏矩阵:杨氏矩阵和钩子公式 Hall定理:Hall定理学习小记 ...

  7. Qt工程管理

    Qt Creator工程管理Qt Creator以工程项目的方式对源码进行管理一个Qt Creator工程包含不同类型的文件 .pro项目描述文件.pro.user用户配置描述文件 //由Qt Cre ...

  8. Visual Studio 2017 软件包及教程

    下载地址:https://files.cnblogs.com/files/yungle/VisualStudio2017.rar 安装教程:https://mp.weixin.qq.com/s?__b ...

  9. [BZOJ1864][CODEVS2462]三色二叉树

    题目描述 Description 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为“二叉树序列S”: |-0  表示该树没有子节点 S = |-1S1 表示该树有一个子节点, ...

  10. luogu P1084疫情控制 二分

    链接 loj luogu太水不要去了. 思路 二分. 每个军队在一定的时间内越往上越好. 注意一个军队可以跨过1去帮别的. 把能到1脚下的点都存下来特判. 有一种情况是这个子树内只有一个军队,但这个军 ...