用BackgroundWorker执行后台异步操作

在桌面程序开发中,如果需要执行操作数据库或访问网络等耗时操作,会导致UI线程堵塞、界面卡死,所以应当把耗时操作放到新建线程中执行,但其他线程不能修改UI,这导致操作进度无法回馈给用户界面。

解决方法有很多,其中BackgroundWorker是.NET里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。

代码如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Threading;
  7 using System.Windows;
  8 using System.Windows.Controls;
  9 using System.Windows.Data;
 10 using System.Windows.Documents;
 11 using System.Windows.Input;
 12 using System.Windows.Media;
 13 using System.Windows.Media.Imaging;
 14 using System.Windows.Navigation;
 15 using System.Windows.Shapes;
 16
 17 namespace BGW
 18 {
 19     /// <summary>
 20     /// MainWindow.xaml 的交互逻辑
 21     /// </summary>
 22     public partial class MainWindow : Window
 23     {
 24         BackgroundWorker bgWorker = new BackgroundWorker();
 25         public MainWindow()
 26         {
 27             InitializeComponent();
 28             backgroundWorkerInit();
 29         }
 30
 31         private void backgroundWorkerInit()
 32         {
 33             //使BackgroundWorker能够报告工作进度
 34             bgWorker.WorkerReportsProgress = true;
 35             //使BackgroundWorker支持异步取消
 36             bgWorker.WorkerSupportsCancellation = true;
 37             //绑定事件,在BackgroundWorker.RunWorkerAsync()时发生
 38             bgWorker.DoWork += Work;
 39             //绑定事件,在BackgroundWorker.ReportProgress(int)时发生
 40             bgWorker.ProgressChanged += ProgressChanged;
 41             //绑定事件,在BackgroundWorker完成或被终止时发生
 42             bgWorker.RunWorkerCompleted += RunWorkerCompleted;
 43         }
 44
 45         private void btn_start_Click(object sender, RoutedEventArgs e)
 46         {
 47             if (!bgWorker.IsBusy)
 48             {
 49                 pb.Value = 0;
 50                 pb.Maximum = 100;
 51                 tb.Clear();
 52                 //开始后台异步操作
 53                 bgWorker.RunWorkerAsync();
 54             }
 55         }
 56
 57         private void btn_abort_Click(object sender, RoutedEventArgs e)
 58         {
 59             //取消后台异步操作
 60             bgWorker.CancelAsync();
 61         }
 62
 63         #region BackgroundWorker事件
 64
 65         private void Work(object sender, DoWorkEventArgs args)
 66         {
 67             BackgroundWorker worker = sender as BackgroundWorker;
 68             for (int i = 1; i <= 100; i++)
 69             {
 70                 if (worker.CancellationPending)
 71                 {
 72                     args.Cancel = true;
 73                     break;
 74                 }
 75                 else
 76                 {
 77                     //报告进度
 78                     worker.ReportProgress(i);
 79                     //模拟费时操作
 80                     Thread.Sleep(100);
 81                 }
 82             }
 83         }
 84
 85         private void ProgressChanged(object sender, ProgressChangedEventArgs args)
 86         {
 87             pb.Value = args.ProgressPercentage;
 88             tb.Text = String.Format("第{0}项工作\n", args.ProgressPercentage) + tb.Text;
 89         }
 90
 91         private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
 92         {
 93             if (args.Cancelled)
 94             {
 95                 MessageBox.Show("手动取消", "Message");
 96             }
 97             else
 98             {
 99                 MessageBox.Show("正常结束", "Message");
100             }
101         }
102
103         #endregion
104     }
105 }

运行截图:

时间: 2024-10-22 08:16:20

用BackgroundWorker执行后台异步操作的相关文章

使用BackgroundWorker组件进行异步操作编程

本文介绍了BackgroundWorker组件的功能及在基于事件的异步操作编程中的应用,并对组件的实现原理进行简述.在应用程序中,可能会遇到一些执行耗时的功能操作,比如数据下载.复杂计算及数据库事务等,一般这样的功能会在单独的线程上实现,执行结束后结果显示到用户界面上,这样可避免造成用户界面长时间无响应情况.在.NET 2.0及以后的版本中,FCL提供了BackgroundWorker组件来方便的实现这些功能要求. 组件介绍 BackgroundWorker类位于System.Component

js方法内Ajax请求数据判断,验证无效(OnClientClick=&quot;return Method();&quot;),还是直接执行后台代码

function CheckAdd() { var flag = true; $.ajax({ cache: false, async: false, url: "/ajaxpage/getajax.aspx?t=adjserviceclientlist&Cellphone=" + Cellphone + "&a=" + Math.random(), dataType: 'json', success: function (data) { if (d

解决Button设置disabled后无法执行后台代码问题

一.开始调式下面的程序,发现Button在js中设置disabled后无法执行后台代码(btnsave_Click)问题 <asp:Button ID="btnsave" runat="server" Text="确 定" OnClick="btnsave_Click" OnClientClick="this.disabled = true;alert('提示');" /> 二.有的朋友会认为在

asp.net服务器控件button先执行js再执行后台的方法

关于button这个服务器控件,我一直想减少它向服务器提交数据.那些检测,还是在客户端实现就好了.这就需要javascript,但是我发现仅仅有javascript还是不够的.button服务器控件的单击事件叫“onClick”,所以javascript就无法使用这个事件.因为重名了.我想实现的是单击button的时候,先执行客户端的javascript代码,然后再执行后台事件. 如果使用的是html控件,就不存在这种问题了.但是,我就是想实现服务器控件的这一功能,有时候服务器控件也是很好用的.

JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法(转)

原文:JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法 jquery-easyui是一个基于jquery的图形界面插件,利用easyui可以创建很多好看的网页界面效果,easyui的相关地址是:http://jquery-easyui.wikidot.com/: easyui的中文文档地址是:http://www.easyui.net/,本人也利用easeyUI在做一些页面效果.由于我很喜欢那种弹出的对话框界面,因此在界面中应用了Dialog类来处理一些确认

ASP.NET - 服务器控件button 先执行js 再执行后台的方法

关于button这个服务器控件,我一直想减少它向服务器提交数据.那些检测,还是在客户端实现就好了.这就需要javascript,但是我发现仅仅有javascript还是不够的.button服务器控件的单击事件叫“onClick”,所以javascript就无法使用这个事件.因为重名了.我想实现的是单击button的时候,先执行客户端的javascript代码,然后再执行后台事件. 如果使用的是html控件,就不存在这种问题了.但是,我就是想实现服务器控件的这一功能,有时候服务器控件也是很好用的.

js 触发LinkButton点击事件,执行后台方法

页面 <asp:LinkButton ID="lbtButton" runat="server"  CssClass="lbtButton" Font-Underline="false" OnClick="lbtButton_Click"> js function clickButton(filePath, fileName){ __doPostBack('lbtButton', ''); }

从Powershell 入侵脚本学到的如何执行后台runspace~

豆子今天无聊在github上看看有什么有意思的PowerShell脚本,无意中发现了PowerSploit这个项目,仔细看了看,这个模块是针对入侵测试写的,里面有大量相关的黑客脚本,随便找了一个试试看. 比如说这个,可以用来记录键盘的输入内容,完整的脚本我就不贴出来了. https://github.com/PowerShellMafia/PowerSploit/blob/dev/Exfiltration/Get-Keystrokes.ps1 具体实现的功能先不去考虑,我很好奇他是怎么在后台执行

在Android中使用Handler和Thread线程执行后台操作

转载自:http://www.cnblogs.com/crazypebble/archive/2011/03/23/1991829.html 声明:此文在参考<解密Google Android>一书 和 Android视频教程(www.mars-droid.com). 大家都知道,在PC上的应用程序当需要进行一些复杂的数据操作,但不需要界面UI的时候,我们会为应用程序专门写一个线程去执行这些复杂的数据操作.通过线程,可以执行例如:数据处理.数据下载等比较耗时的操作,同时对用户的界面不会产生影响