WPF BackGroundWord 异步加载更新进度条示例
Posted lipengxu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF BackGroundWord 异步加载更新进度条示例相关的知识,希望对你有一定的参考价值。
1 <Window x:Class="AsynchronousLoading.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:AsynchronousLoading" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="700" Width="1000" Loaded="Window_Loaded" WindowStartupLocation="CenterScreen"> 9 <Grid> 10 <ListView HorizontalAlignment="Left" x:Name="ItemListView" FontSize="30" Width="389" ></ListView> 11 12 </Grid> 13 </Window>
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace AsynchronousLoading { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public List<string> list = new List<string>(); public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { GetDataWin getDataWin = new GetDataWin(); getDataWin.list = list; getDataWin.count = 100; if (getDataWin.ShowDialog()==true) //数据全部获取完成之后再执行下一步操作 反正不执行 { LoadData loadData = new LoadData(this.list,this.ItemListView); if (loadData.ShowDialog() == true) { MessageBox.Show("操作完成!"); } } } } }
namespace AsynchronousLoading { /// <summary> /// 自定义传参类 /// </summary> public class CommentModel { /// <summary> /// 第几个 /// </summary> public int num { get; set; } /// <summary> /// 当前添加的字符串项 /// </summary> public string itemStr { get; set; } } }
1 <Window x:Class="AsynchronousLoading.GetDataWin" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:AsynchronousLoading" 7 mc:Ignorable="d" 8 Title="正在获取数据..." Height="170" Width="800" x:Name="GetDataWindow" Loaded="GetDataWindow_Loaded" WindowStartupLocation="CenterScreen"> 9 <Grid> 10 <ProgressBar x:Name="GetDataPro" Height="20" Minimum="0" /> 11 <Label x:Name="arealyNum" Content="已获得: 0" Height="30" FontSize="15" Foreground="Green" Margin="90,20,551,90"/> 12 <Label x:Name="noNum" Content="未获得: 0" Height="30" FontSize="15" Foreground="Red" Margin="291,10,345,79"/> 13 <Label x:Name="totalCount" Content="共计数据: 0 条" FontSize="15" Height="30" Margin="524,10,107,79"/> 14 <Button x:Name="btnCancel" Content="取消" FontSize="15" Height="20" Margin="347,81,297,18" Click="BtnCancel_Click" /> 15 </Grid> 16 </Window>
using System; using System.Collections.Generic; using System.Windows; using System.ComponentModel; using System.Threading; namespace AsynchronousLoading { /// <summary> /// GetDataWin.xaml 的交互逻辑 /// </summary> public partial class GetDataWin : Window { public List<string> list { get; set; } //添加的数据集合 public int count { get; set; } //要添加的集合的元素个数 BackgroundWorker bgWork = new BackgroundWorker(); public GetDataWin() { InitializeComponent(); bgWork.WorkerReportsProgress = true; //支持报告进度 bgWork.WorkerSupportsCancellation = true; //支持取消 } private void GetDataWindow_Loaded(object sender, RoutedEventArgs e) { this.GetDataPro.Maximum = this.count; this.totalCount.Content = "共计数据: " + this.count + "条!"; bgWork.DoWork += BgWork_DoWork; //异步操作 bgWork.RunWorkerAsync(count); //开始异步操作 bgWork.ProgressChanged += BgWork_ProgressChanged; //更新进度条 bgWork.RunWorkerCompleted += BgWork_RunWorkerCompleted; //任务执行完成之后引发的事件 } //后台异步执行 private void BgWork_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker backgroundWorker = sender as BackgroundWorker; int count =(int)e.Argument; for (int i = 0; i < count; i++) { if (backgroundWorker.CancellationPending) { e.Cancel = true; return; } this.list.Add((i+1).ToString()); backgroundWorker.ReportProgress(i,i.ToString()); Thread.Sleep(1000); } e.Result = this.list; //事件处理完成之后的结果 } //取消后台执行 private void BtnCancel_Click(object sender, RoutedEventArgs e) { bgWork.CancelAsync(); } //更新进度条UI 显示进度 private void BgWork_ProgressChanged(object sender, ProgressChangedEventArgs e) { int num = int.Parse(e.UserState.ToString()); this.arealyNum.Content = "已获得: " + num; this.noNum.Content = "未获得: " + (this.count - num); this.GetDataPro.Value = e.ProgressPercentage; } //处理完成 private void BgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) //任务取消 { MessageBox.Show("任务取消执行!"); this.Close(); } else if (e.Error!=null) //出现异常 { MessageBox.Show("出现异常啦!" + e.Error.Message + e.Error.Source + e.Error.StackTrace); } else { this.DialogResult = true; //设置窗体的返回值为true 表示已经获取全部的数据 this.Close(); //操作完成之后关闭窗口 } } } }
1 using System; 2 using System.Collections.Generic; 3 using System.Windows; 4 using System.ComponentModel; 5 using System.Threading; 6 namespace AsynchronousLoading 7 { 8 /// <summary> 9 /// GetDataWin.xaml 的交互逻辑 10 /// </summary> 11 public partial class GetDataWin : Window 12 { 13 public List<string> list { get; set; } //添加的数据集合 14 public int count { get; set; } //要添加的集合的元素个数 15 BackgroundWorker bgWork = new BackgroundWorker(); 16 public GetDataWin() 17 { 18 19 InitializeComponent(); 20 21 bgWork.WorkerReportsProgress = true; //支持报告进度 22 bgWork.WorkerSupportsCancellation = true; //支持取消 23 } 24 25 private void GetDataWindow_Loaded(object sender, RoutedEventArgs e) 26 { 27 this.GetDataPro.Maximum = this.count; 28 this.totalCount.Content = "共计数据: " + this.count + "条!"; 29 bgWork.DoWork += BgWork_DoWork; //异步操作 30 bgWork.RunWorkerAsync(count); //开始异步操作 31 bgWork.ProgressChanged += BgWork_ProgressChanged; //更新进度条 32 bgWork.RunWorkerCompleted += BgWork_RunWorkerCompleted; //任务执行完成之后引发的事件 33 } 34 //后台异步执行 35 private void BgWork_DoWork(object sender, DoWorkEventArgs e) 36 { 37 BackgroundWorker backgroundWorker = sender as BackgroundWorker; 38 int count =(int)e.Argument; 39 for (int i = 0; i < count; i++) 40 { 41 if (backgroundWorker.CancellationPending) 42 { 43 e.Cancel = true; 44 return; 45 } 46 this.list.Add((i+1).ToString()); 47 backgroundWorker.ReportProgress(i,i.ToString()); 48 Thread.Sleep(1000); 49 } 50 e.Result = this.list; //事件处理完成之后的结果 51 } 52 //取消后台执行 53 private void BtnCancel_Click(object sender, RoutedEventArgs e) 54 { 55 bgWork.CancelAsync(); 56 } 57 //更新进度条UI 显示进度 58 private void BgWork_ProgressChanged(object sender, ProgressChangedEventArgs e) 59 { 60 int num = int.Parse(e.UserState.ToString()); 61 this.arealyNum.Content = "已获得: " + num; 62 this.noNum.Content = "未获得: " + (this.count - num); 63 this.GetDataPro.Value = e.ProgressPercentage; 64 } 65 //处理完成 66 private void BgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 67 { 68 if (e.Cancelled) //任务取消 69 { 70 MessageBox.Show("任务取消执行!"); 71 this.Close(); 72 } 73 else if (e.Error!=null) //出现异常 74 { 75 MessageBox.Show("出现异常啦!" + e.Error.Message + e.Error.Source + e.Error.StackTrace); 76 } 77 else 78 { 79 this.DialogResult = true; //设置窗体的返回值为true 表示已经获取全部的数据 80 this.Close(); //操作完成之后关闭窗口 81 } 82 83 } 84 85 86 } 87 }
using System; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.ComponentModel; using System.Threading; namespace AsynchronousLoading { /// <summary> /// LoadData.xaml 的交互逻辑 /// </summary> public partial class LoadData : Window { private ListView listView { get; set; } //向列表中添加 private List<string> list {get;set;} //源数据集合 BackgroundWorker bgWork = new BackgroundWorker(); public LoadData(List<string> list, ListView listViews) { InitializeComponent(); if (list!=null&& listViews!=null) { this.list = list; this.listView = listViews; } bgWork.WorkerReportsProgress = true; bgWork.WorkerSupportsCancellation = true; } private void LoadDataWin_Loaded(object sender, RoutedEventArgs e) { int count = this.list.Count; this.totalCount.Content = "共计数据: " +count + "条!"; this.LoadDataPro.Maximum = count; //初始化Progress 控件的最大值 bgWork.DoWork += BgWork_DoWork; //异步操作 bgWork.RunWorkerAsync(); //开始异步执行 bgWork.ProgressChanged += BgWork_ProgressChanged; //更新UI bgWork.RunWorkerCompleted += BgWork_RunWorkerCompleted; //操作完成 异常 取消事件 } //处理数据操作 private void BgWork_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker backgroundWorker = sender as BackgroundWorker; for (int i = 0; i <this.list.Count ; i++) { if (backgroundWorker.CancellationPending) { e.Cancel = true; return; } Thread.Sleep(1000); backgroundWorker.ReportProgress(i, new CommentModel(){ num=i, itemStr=this.list[i] }); } } //取消操作 private void BtnCancel_Click(object sender, RoutedEventArgs e) { bgWork.CancelAsync(); } //更新UI private void BgWork_ProgressChanged(object sender, ProgressChangedEventArgs e) { CommentModel commentModel = e.UserState as CommentModel; if (this.listView.Items.Add(commentModel.itemStr)>=0) { this.LoadDataPro.Value = e.ProgressPercentage; int count = commentModel.num; this.arealyNum.Content = "已加载: " + count; this.noNum.Content = "未加载: " + (this.list.Count - count); } else { MessageBox.Show(commentModel.itemStr+"项未加载!"); return; } } //处理完成事件 private void BgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) //任务取消 { MessageBox.Show("任务取消执行!"); this.Close(); } else if (e.Error != null) //出现异常 { MessageBox.Show("出现异常啦!" + e.Error.Message + e.Error.Source + e.Error.StackTrace); } else { this.DialogResult = true; this.Close(); //操作完成之后关闭窗口 } } } }
以上是关于WPF BackGroundWord 异步加载更新进度条示例的主要内容,如果未能解决你的问题,请参考以下文章
在 C# Caliburn Micro WPF 中异步和等待获取 HttpRequest 时更新 ProgressBar