<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. hive 使用反射函数

    在hive中通过反射,调用java.net.URLDecoder,解码url 代码入下: select reflect('java.net.URLDecoder', 'decode',url, 'UT ...

  2. CentOS7 openssh7.9p1安装

    先安装telnet,以防安装ssh出现问题,无法远程登录设备. 最新版openssh下载地址:http://www.openssh.com/ftp.html 一.安装telnet和xinetd: 1. ...

  3. WPF的AutoCompleteBox控件

    AutoCompleteBox怎么用,网上都能查得到,本文就不再赘述. 最近在用的时候,发现一个小BUG,当匹配数据的个数超过了Drop页面能够显式的数据个数时,如果此时一直按键盘上“向下的箭头”,你 ...

  4. EBS五种安全性屏蔽解析

    http://blog.11equals3.top/2018/02/09/190/ 分类帐集 定义: 分类帐集顾名思义就是分类账的集合.它是总帐提供的将相同科目表和相同日历的多个分类帐集合一起用于多分 ...

  5. Hadoop集群及基本组件搭建

    本人采用一个master和两个slave的网络结构,具体搭建如下 1.准备安装包 1.下载安装包 http://pan.baidu.com/s/1jIoZulw 2.安装包清单 scala-2.12. ...

  6. Jenkins关闭和重启实现方式.

    1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/,那么我只需要在浏览器地址栏上敲下http ...

  7. C#介绍RabbitMQ使用篇一HelloWorld

    RabbitMQ官网官方介绍: 译文: RabbitMQ是目前部署最广泛的开源消息代理(何为代理?可以理解为一个提供功能服务的中间件). 在全球范围内的大小企业中的生产环境中,RabbitMQ的部署两 ...

  8. map put值 使用匿名函数

    List<Map<String, Object>> list = setRoleMenuRlMapper.selectMapByParams(params); // Map m ...

  9. Android 自定义 View 绘制

    在 Android 自定义View 里面,介绍了自定义的View的基本概念.同时在 Android 控件架构及View.ViewGroup的测量 里面介绍了 Android 的坐标系 View.Vie ...

  10. map,set和weakmap,weakset

    概述 set和map属于es6的内容,今天在看书的时候遇到了,所以好好的总结一下,供以后开发时参考,相信对其他人也有用. 参考资料: mdn Keyed collections Map和WeakMap ...