<Window x:Class="AsynchronousLoading.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:AsynchronousLoading"
mc:Ignorable="d"
Title="MainWindow" Height="" Width="" Loaded="Window_Loaded" WindowStartupLocation="CenterScreen">
<Grid>
<ListView HorizontalAlignment="Left" x:Name="ItemListView" FontSize="" Width="" ></ListView> </Grid>
</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 = ; 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; }
}
}
 <Window x:Class="AsynchronousLoading.GetDataWin"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:AsynchronousLoading"
mc:Ignorable="d"
Title="正在获取数据..." Height="" Width="" x:Name="GetDataWindow" Loaded="GetDataWindow_Loaded" WindowStartupLocation="CenterScreen">
<Grid>
<ProgressBar x:Name="GetDataPro" Height="" Minimum="" />
<Label x:Name="arealyNum" Content="已获得: 0" Height="" FontSize="" Foreground="Green" Margin="90,20,551,90"/>
<Label x:Name="noNum" Content="未获得: 0" Height="" FontSize="" Foreground="Red" Margin="291,10,345,79"/>
<Label x:Name="totalCount" Content="共计数据: 0 条" FontSize="" Height="" Margin="524,10,107,79"/>
<Button x:Name="btnCancel" Content="取消" FontSize="" Height="" Margin="347,81,297,18" Click="BtnCancel_Click" />
</Grid>
</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 = ; i < count; i++)
{
if (backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
this.list.Add((i+).ToString());
backgroundWorker.ReportProgress(i,i.ToString());
Thread.Sleep();
}
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(); //操作完成之后关闭窗口
} } }
}
 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 = ; i < count; i++)
{
if (backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
this.list.Add((i+).ToString());
backgroundWorker.ReportProgress(i,i.ToString());
Thread.Sleep();
}
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(); //操作完成之后关闭窗口
} } }
}
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 = ; i <this.list.Count ; i++)
{
if (backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
Thread.Sleep();
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)>=)
{
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 异步加载更新进度条示例的更多相关文章

  1. android 网络异步加载数据进度条

    ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...

  2. android AsyncTask异步下载并更新进度条

    AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...

  3. js - 预加载+监听图片资源加载制作进度条

    这两天遇到一个新需求:一个一镜到底的h5动画.因为功能的特殊性,就要求我们提前监听页面的静态图片是否全部加载完毕.即处理预加载. 总结下来,下次这种需求需要提前注意以下几点: 一.图片而不是背景图 本 ...

  4. 学习Echarts:(二)异步加载更新

    这部分比较简单,对图表的异步加载和更新,其实只是异步获取数据然后通过setOption传入数据和配置而已. $.get('data.json').done(function (data) { myCh ...

  5. cocos2dx 3.x(加载cocostudio进度条)

    // // MyLoagingScene.hpp // My // // Created by work on 16/10/13. // // #ifndef MyLoagingScene_hpp # ...

  6. js 多张图片加载 环形进度条

    css 部分使用 svg 绘制环形 svg{width:100px; height: 100px; margin:15% auto 25%; box-sizing:border-box; displa ...

  7. 利用LruCache为GridView异步加载大量网络图片完整示例

    MainActivity如下: package cc.testlrucache; import android.os.Bundle; import android.widget.GridView; i ...

  8. WebView长按保存图片;WebView不跳转到系统的浏览器;WebView加载显示进度条;WebView返回事件处理;

    直接看代码即可,代码里面注释写的很清楚,这个类拉下来就能用: 写法和命名比较粗暴,但也简单易懂: public class MainActivity extends AppCompatActivity ...

  9. Unity异步加载场景loading条

    using UnityEngine; using System.Collections; public class LoadingScene : MonoBehaviour { public UISl ...

随机推荐

  1. PYTHON进阶(3)

    学习内容: 1.Python模块redis 2.Python模块memcach 3.Python模块SQLAlchemy 一.Python模块redis redis介绍 二.Python模块memca ...

  2. js:函数与变量作用域的提升

    一.要彻底理解JS的作用域和Hoisting,只要记住以下三点即可:      1.所有申明都会被提升到作用域的最顶上      2.同一个变量申明只进行一次,并且因此其他申明都会被忽略      3 ...

  3. 卷积神经网络中的channel 和filter

    在深度学习的算法学习中,都会提到 channels 这个概念.在一般的深度学习框架的 conv2d 中,如 tensorflow .mxnet,channels 都是必填的一个参数. channels ...

  4. python爬虫学习之查询IP地址对应的归属地

    话不多说,直接上代码吧. import requests def getIpAddr(url): response = requests.get(url) response.encoding=resp ...

  5. 为什么要学习 Spring Boot?

    我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发中真正意义上的标准,但是随着技术的发展,Java E ...

  6. 虚拟机安装mysql

    安装mysql8.0方法:  1.首先,ubuntu安装mysql8.0(此版本比较好装),所以要先更新一下源,去MySQL官网http://dev.mysql.com/downloads/repo/ ...

  7. 吴恩达机器学习笔记33-评估一个假设输出(Evaluating a Hypothesis Outpute)

    当我们确定学习算法的参数的时候,我们考虑的是选择参量来使训练误差最小化,有人认为得到一个非常小的训练误差一定是一件好事,但我们已经知道,仅仅是因为这个假设具有很小的训练误差,并不能说明它就一定是一个好 ...

  8. silverlight属性改变事件通知

    工作中遇到silverlight本身没有提供的某些属性改变事件,但又需要在属性改变时得到通知,Google搬运stack overflow,原地址 /// Listen for change of t ...

  9. Python代码规范之---代码不规范,亲人两行泪

    任何语言的程序员,编写出符合规范的代码,是开始程序生涯的第一步! 关于代码规范 Python 官方提供有一系列 PEP(Python Enhancement Proposals) 文档 其中第 8 篇 ...

  10. Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库

    搭建背景 企业环境中使用Docker环境,一般出于安全考虑,业务使用的镜像一般不会从第三方公共仓库下载.那么就要引出今天的主题 企业级环境中基于Harbor搭建自己的安全认证仓库 介绍 名称:Harb ...