<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. 11个炫酷的Linux终端命令大全

    我已经用了十年的Linux了,通过今天这篇文章我将向大家展示一系列的命令.工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我. 1.命令行日常系快捷键 如下的快捷方式非常有用,能够 ...

  2. feign调用spring clound eureka 注册中心服务

    @RestController public class TestService { private TestApi computeClient; private static final Strin ...

  3. MySQL--Double Write

    ##=======================================##目前大部分服务器使用4K或512B来格式化磁盘,而Innodb存储引擎使用默认16K的数据页,在写入16KB数据页 ...

  4. C语言窗口例子

    #include <windows.h> LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ; //声明用来处理消息的函数 in ...

  5. ajax jsonp请求报错not a function的解决方案

    概述 最近工作中使用ajax,有时会报json4 is not a function的错误,有时又不会报错.找了很久,网上说是因为多次请求同一个资源导致的,但是我检查了自己的代码,对于重复资源并没有重 ...

  6. PyTorch--双向递归神经网络(B-RNN)概念,源码分析

    关于概念: BRNN连接两个相反的隐藏层到同一个输出.基于生成性深度学习,输出层能够同时的从前向和后向接收信息.该架构是1997年被Schuster和Paliwal提出的.引入BRNNS是为了增加网络 ...

  7. MySQL5.7免安装版配置图文教程

    MySQL5.7免安装版配置图文教程 更新时间:2017年09月06日 10:22:11   作者:吾刃之所向    我要评论 Mysql是一个比较流行且很好用的一款数据库软件,如下记录了我学习总结的 ...

  8. 【ABP框架系列学习】模块系统(4)

    0.引言 ABP提供了构建模块和通过组合模块以创建应用程序的基础设施.一个模块可以依赖于另外一个模块.通常,程序集可以认为是模块.如果创建多个程序集的应用程序,建议为每个程序集创建模块定义. 当前,模 ...

  9. MySQL、MariaDB修改默认字符集

    修改2017.4.9: 最近在使用MariaDB,遇到了同样的问题:中文乱码.因为mariadb他有好几个ini文件,但是可以根据自己开发需要创建一个my.ini,然后我试着去修改mariadb安装目 ...

  10. 【shiro】(1)---了解权限管理

    了解权限管理 一.概念 1.什么是权限管理 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理包 ...