using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Threading;
using System.Windows.Forms; namespace BackgroundWorkerExplore
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} #region 异步处理
//002
private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e)
{
int max = (int)e.Argument;
int percent = 0;
for (int i = 1; i <= max; i++)
{
if (worker.CancellationPending) return i; percent = (int)(((double)i / (double)max) * 100);
// 摘要:
// 引发 System.ComponentModel.BackgroundWorker.ProgressChanged 事件。
// percentProgress: 已完成的后台操作所占的百分比,范围从 0% 到 100%。
// userState:/ 传递到 System.ComponentModel.BackgroundWorker.RunWorkerAsync(System.Object) 的状态对象。
worker.ReportProgress(percent, new KeyValuePair<int, string>(i, Guid.NewGuid().ToString()));
Thread.Sleep(500);
} return max;
}
//001 首先执行dowork
private void bgworker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
e.Result = RetrieveData(this.bgworker, e);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
} //003
private void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
KeyValuePair<int, string> record = (KeyValuePair<int, string>)e.UserState;
//操作UI
this.labelResultLeft.Text = string.Format("There are {0} records retrieved!", record.Key);
this.progressBarLeft.Value = e.ProgressPercentage;
this.lvLeft.Items.Add(record.Value);
} //004所有操作执行完后执行
private void bgworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
this.labelResultLeft.Text = string.Format("Total records: {0}", e.Result);
this.btnStart.Enabled = true;
this.btnStop.Enabled = false;
}
catch (TargetInvocationException ex)
{
MessageBox.Show(ex.InnerException.GetType().ToString());
}
}
#endregion private void btnStart_Click(object sender, EventArgs e)
{
if (this.bgworker.IsBusy) return; this.lvLeft.Items.Clear();
int MaxValue = 10;
this.bgworker.RunWorkerAsync(MaxValue);
this.btnStart.Enabled = false;
this.btnStop.Enabled = true;
} private void btnStop_Click(object sender, EventArgs e)
{
this.bgworker.CancelAsync();
}
}
}

运行效果:

Winfrom BackgroundWorker的更多相关文章

  1. BackgroundWorker实现的winfrom中实现异步等待加载图片显示

    BackgroundWorker简介    BackgroundWorker在winfrom中有对应控件,该有三个事件:DoWork .ProgressChanged 和 RunWorkerCompl ...

  2. 实现winfrom进度条及进度信息提示,winfrom程序假死处理

    1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...

  3. 实现winfrom进度条及进度信息提示

    1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...

  4. [转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理

    china_xuhua 原文地址 1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线 ...

  5. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...

  6. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  7. C# 多線程&BackgroundWorker概念入門教程

    感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下  http://jingyan.baidu.c ...

  8. 【C#】【Thread】BackgroundWorker的使用

    BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递Do ...

  9. winfrom 隐藏任务栏(win7)

    1:新建winfrom 窗体应用程序 2:拖入contextMenuStrip.notifyIcon 2个控件 3:如图 4:code: 注意:复制控件事件要注册 using System; usin ...

随机推荐

  1. 马凯军201771010116《面向对象与程序设计Java》第十二周学习总结

    一.理论与知识学习部分 Java的抽象窗口工具箱(Abstract Window Toolkit, AWT)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类. 大部分AWT组件都 ...

  2. python基础—sys与os库

    python可以用sys库打印环境变量或者查看当前文件的脚本路径,具体代码: import sysprint(sys.path[2])#打印环境变量print(sys.argv)#当前脚本路径 os库 ...

  3. 【linux】State : Uninterruptible, pid: 3936

    运行centos7中yum命令时提示: Existing lock /var/run/yum.pid: another copy is running as pid 3936.Another app ...

  4. React native中DrawerNavigator,StackNavigator,TabNavigator导航栏使用

    import React from 'react'; import { View, Text,Button } from 'react-native'; import { DrawerNavigato ...

  5. stack.isEmpty()和empty()

    public class Stack<E> extends Vector<E> 可以看到Stack类继承了Vector类 这个是stack类里面的方法: /** * Tests ...

  6. ValueError: attempted relative import beyond top-level package

    python 项目 在pycharm中, 在某个文件夹下: 右键--> mark directory as --> source root 如何在python脚本或者shell中 用代码实 ...

  7. Vue原理--虚拟DOM

    为什么需要虚拟DOM? 如果对前端工作进行抽象的话,主要就是维护状态和更新视图,而更新视图和维护状态都需要DOM操作.其实近年来,前端的框架主要发展方向就是解放DOM操作的复杂性. 运行js的速度是很 ...

  8. 微信h5,背景音乐自动播放

    移动端默认是禁止背景音乐自动播放的,很多需求都需要在页面加载完成的情况下同时出现背景音乐. 既然是微信h5,那么wx.config肯定不陌生,废话不多,直接上代码: html: <audio s ...

  9. day09 小练习 斐波那契数列 文件

    #2.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素, # 并将其作为新列表返回. # def get_odd_list(info): # ul=info[1::2] # return ...

  10. 设置table的每竖的宽度