WPF 精修篇 BackgroundWorker
Posted lonelyxmas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 精修篇 BackgroundWorker相关的知识,希望对你有一定的参考价值。
原文:WPF 精修篇 BackgroundWorker
效果
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="22*"/>
- <RowDefinition Height="11*"/>
- <RowDefinition Height="47*"/>
- </Grid.RowDefinitions>
- <StackPanel Orientation="Horizontal" Margin="0,28" VerticalAlignment="Center">
- <Label>开始数据</Label>
- <TextBox x:Name="beginText" HorizontalAlignment="Left" Height="31" TextWrapping="Wrap" Text="100" VerticalAlignment="Top" Width="100"/>
- <Label>结束数据</Label>
- <TextBox x:Name="endText" HorizontalAlignment="Left" Height="31" TextWrapping="Wrap" Text="1000000000" VerticalAlignment="Top" Width="100"/>
- <Button x:Name="button" Content="开始" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Click="Button_Click"/>
- <Button x:Name="Cancel" Content="取消" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Click="Cancel_Click"/>
- </StackPanel>
- <StackPanel Margin="0" Grid.Row="1" Grid.RowSpan="2">
- <TextBlock x:Name="odd" TextWrapping="Wrap" Text="奇数数量:"/>
- <TextBlock x:Name="even" TextWrapping="Wrap" Text="偶数数量:"/>
- <ProgressBar x:Name="Prebar" Height="20"/>
- </StackPanel>
- </Grid>
- private int oddcount =0;
- private int evencount =0;
- public void Make(int from ,int to)
- {
- oddcount = 0;
- evencount = 0;
- int num = (to - from) / 100;
- for (int i = from; i < to; i++)
- {
- if (worker.CancellationPending == true)
- {
- return;
- }
-
- if (i % 2 == 0)
- {
- evencount++;
- }
- else
- {
- oddcount++;
- }
- if (i % num == 0 && (worker != null) && (worker.WorkerReportsProgress = true))
- {
- worker.ReportProgress(i / num);
- }
- }
-
- }
- BackgroundWorker worker = null;
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- int from=0;
- int to = 0;
- if(int.TryParse(beginText.Text,out from)&&int.TryParse(endText.Text,out to) )
- {
- button.IsEnabled = false;
- odd.Text = "奇数数量:0" ;
- even.Text = "偶数数量:0" ;
-
- worker = new BackgroundWorker();
- //异步取消 需要增加这个 不然取消失效
- worker.WorkerSupportsCancellation = true;
- //支持报告进度
- worker.WorkerReportsProgress = true;
- //注册滚动条事件
- worker.ProgressChanged+=worker_ProgressChanged;
-
- //注册任务
- worker.DoWork+=worker_DoWork;
- //任务完毕触发
- worker.RunWorkerCompleted += worker_RunWorkerCompleted;
- //给任务传参
- worker.RunWorkerAsync(new Tuple<int, int>(from, to));
-
- }
-
- }
-
- private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
- {
- Prebar.Value = e.ProgressPercentage;
- }
-
- void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- // throw new NotImplementedException();
- if (sender is BackgroundWorker)
- {
-
- if (e.Cancelled == true)
- {
- odd.Text = "任务已取消";
- even.Text = "";
- }
- else
- {
- odd.Text = "奇数数量:" + oddcount;
- even.Text = "偶数数量:" + evencount;
- }
- BackgroundWorker k = (BackgroundWorker)sender;
- k.DoWork -= worker_DoWork;
- k.RunWorkerCompleted -= worker_RunWorkerCompleted;
- k = null;
- button.IsEnabled = true;
- }
-
- }
-
- private void worker_DoWork(object sender, DoWorkEventArgs e)
- {
- var args = ( Tuple<int, int>)e.Argument;
- Make(args.Item1, args.Item2);
- if (worker.CancellationPending == true)
- {
- e.Cancel = true;
- }
- }
-
-
- private void Cancel_Click(object sender, RoutedEventArgs e)
- {
-
- worker.CancelAsync();
- }
以上是关于WPF 精修篇 BackgroundWorker的主要内容,如果未能解决你的问题,请参考以下文章