还记得BackgroundWorker吗

打开电脑,突然想起来,昨天下午,有位仁兄和我讨论过一个事,不妨拿来说说。

她说她的 牛逼程序要处理一堆东东,要弄个进度条作提示,不过进度条是在另一个窗口中的,她的想法是,在开 始处理数据时弹出进度对话框,实时显示处理进度,当处理完成后关闭对话框。乍看起来其实不难,不 过她遇到了以下问题,故在群里提问。

1、模态对话框的问题。

这问题好办,一般来说, 要长时间来处理数据,应该考虑后台异步操作,用砖家的话讲就是多线程。不过她在显示窗口时调用了 ShowDialog方法,这样代码会一直停在那里,直到窗口关闭。

如果是异步操作,通常来说,在启 动后台任务后会马上返回,这么一来,只要把代码的顺序调一下就可以解决这问题,先启动后台任务, 再调用ShowDialog方法,这样一来,就算代码停在ShowDialog那里也不会影响后台任务的执行。

2、如何控制其他窗口中控件。

可以在在窗口类中定义公共方法来对控件进行某些操作, 之后在其他地方就可以通过这些公共方法来调控。如果是跨线程调用,应当考虑使用委托或事件来调用 。不然你学了委托和事件干吗呢?

另一种方法就是直接把进度窗口中的ProgressBar控件声明为 public,这样其他类就可以轻松访问了。

3、后台任务如何更简单。

方法是灵活的,有很 多种。最简单的是利用.NET 4.5和C# 5.0 中的新特性,这种方法肯定是最简单的。第二种则是使用.NET 4 中新加的Task类来调度线程;比较传统,在2.0时代用得最多的方法是直接用Thread类。

但是 ,有一个组件是专为后台任务而开放的,忘了没有?——BackgroundWorker,也许有些朋友是忘了这个 组件了。现在很多人就是这样,有了小三就忘了结发妻子,我们众多码农也是这样,常常会忘本。

既有后台任务,又要报告进度,用BackgroundWorker不是更合适吗?于是我问了她两遍:“还记 得吗?” 果然不出我所料,记不起来了,呵呵。

说了那么多,估计需要实例才能解决问题,好 吧,上菜。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;  

namespace MyApp
{
    public partial class Form1 : Form
    {
        static string SaveDir = string.Empty;
        private FormProgress fpro = null;
        public Form1()
        {
            InitializeComponent();
            fpro = new FormProgress();
        }  

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            int fileCount = Convert.ToInt32(e.Argument);
            Random rand = new Random();
            byte[] buffer = new byte[2048];
            for (int i = 0; i < fileCount; i++)
            {
                try
                {
                    string fileName = Path.Combine(SaveDir, i.ToString() + ".tmp");
                    using (var stream = File.Create(fileName))
                    {
                        int n = 0;
                        int maxByte = 8 * 1024 * 1024;
                        while (n < maxByte)
                        {
                            rand.NextBytes(buffer);
                            stream.Write(buffer, 0, buffer.Length);
                            n += buffer.Length;
                        }
                    }
                }
                catch
                {
                    continue;
                }
                finally
                {
                    // 报告进度
                    this.backgroundWorker1.ReportProgress(i + 1);
                }
            }
        }  

        private void button1_Click(object sender, EventArgs e)
        {
            if (Directory.Exists(SaveDir) == false)
            {
                return;
            }
            button1.Enabled = false;
            int cout = Convert.ToInt32(this.nmbud.Value);
            this.fpro.progressBar1.Minimum = 0;
            this.fpro.progressBar1.Maximum = cout;
            this.fpro.progressBar1.Value = this.fpro.progressBar1.Minimum;
            this.backgroundWorker1.RunWorkerAsync(cout);
            // 在开始异步操作后ShowDialog
            // 这样即使代码停在那里也不会影响后台任务的执行
            fpro.ShowDialog(this);
        }  

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            int val = e.ProgressPercentage;
            this.fpro.lblText.Text = string.Format("已生成{0}个文件。", val);
            this.fpro.progressBar1.Value = val;
        }  

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            button1.Enabled = true;
            fpro.Hide();
            MessageBox.Show("操作完成。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }  

        private void btnBrowsFd_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fd = new FolderBrowserDialog();
            fd.RootFolder = Environment.SpecialFolder.Desktop;
            if (DialogResult.OK == fd.ShowDialog())
            {
                SaveDir = fd.SelectedPath;
            }
            fd.Dispose();
        }
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索后台
, 方法
, showdialog
, using
, system
, backgroundworker
, 进度
backgroundwork
backgroundworker、c backgroundworker、wpf backgroundworker、backgroundworker用法、多个backgroundworker,以便于您获取更多的相关知识。

时间: 2024-10-31 11:10:52

还记得BackgroundWorker吗的相关文章

还记得我们为外链做的那些事么

还记得我们为外链做的那些事么 在SEO界一直流传着"内容为王.外链为皇"的说法,从外链为皇我们足可以看出外链对于SEO的重要性.外链本是搜索引擎的一种排名算法机制,但是当站长们发现了外链对于网站排名的影响后,从此便开始了发外链的生活.细细回想着以前我们一起发外链的时候,一种莫名的滋味涌上心头,记得刚进入SEO这个行业的第一件事就是发外链,每天为了能够给网站增加那么几个有效的外链,常常费劲心思的在各个论坛留下网址,还时常担心被管理员删帖.   但是如今的SEO界到处都是买卖链接的信息,人

恢复高考40年:还记得你年少时的梦吗?

现在的你回忆当年的高考,还能记起来多少?是考卷上那一道不该错的送分题,还是考试前一天班主任的那句"你再看看题目,我再看看你们"? 今年是恢复高考四十周年,我们邀请到了8位往届考生忆当年.他们通过高考,有的"意外"结缘航空航天,成为国产大飞机总设计师,有的考上最爱的新闻系成为记者. 不论是哪一种改变,都是人生轨迹中不可磨灭的印记.他们的人生,更是这40年来社会变迁的缩影. 1977年 恢复高考让我意外结缘南航 吴光辉,1960年2月生,湖北武汉人,博士,研究员.197

安卓10岁了:这些消失的经典App你还记得吗?

不知不觉,安卓系统已经迈入到第十个年头了.在很多老网友的印象中,iOS和安卓两大系统纵横移动市场,似乎也就是这几年的事,但仔细一查历史,2008年9月正式发布的安卓,已经是实打实十周岁的老系统了. 不知不觉安卓也是征战十年的老兵了 在这十年间,安卓系统不断进化,生态中涌现出了无数令人爱不释手的优秀App. 在安卓生态星火燎原的同时,也有为数不少的经典安卓App停止开发,永远停留在某个令人充满回忆的版本号中.这些已消失的经典安卓App,你还记得多少? 今天就一起来盘点一下那些已经停止更新.离我们远

你还记得曾经的Windows Vista吗?

随着Windows系统的更新换代,Windows 7 凭借着优秀的用户体验.领先的创新技术.还有快速的执行效率,早就已经超过了Windows XP 及其它操作系统,从而成为了市场份额最大的操作系统.但是,在Windows 7风光的背后,又有谁还记得 Windows Vista 呢? 在2007年的1月30日,微软正式面向个人用户发布了 Windows Vista.而这个让微软耗费了上百亿美元.投入万名工程师.用了5年多的时间去开发的划时代操作系统,在其中包含了许多创新的功能.蕴含了大量创新技术,

「音频党」你,还记得手抄歌词的年少时光吗?

初中开始,同学之间不知怎么就开始流行起抄歌词,于是书本角落,桌布上方,能留下痕迹的地方都会有密密麻麻的段落,这些马克笔或者原子笔下的歌词似乎不是感同身受,而是年少时为未来的一种渴望和信仰.遗憾是尚且年少的我或者未能真正体会到歌词更深的含义,却还是喜欢用全力去模仿歌者的语气.看着极具创造力的自我"巨作"或读或唱,看词本卷边泛黄. 时间忘了的,笔迹记得. 我的家在N线小城,在那个似乎略显闭塞的年代,我接触到的欧美和日韩歌曲几乎可以忽略不计,陪我长大的,是更接地气的港乐. 点唱机 90年代的

还记得余额宝背后对接的天弘基金么?

摘要: 还记得余额宝背后对接的天弘基金么?昨日,天弘基金确认了最新的股权结构,公司前三大股东分别为:浙江阿里巴巴电子商务有限公司,占股51%:天津信托有限责任公司,占股16.8 %: 还记得余额宝背后对接的天弘基金么?昨日,天弘基金确认了最新的股权结构,公司前三大股东分别为:浙江阿里巴巴电子商务有限公司,占股51%:天津信托有限责任公司,占股16.8 %:内蒙古君正能源化工股份有限公司(下文简称内蒙君正),占股15.6%.此外,天弘基金管理层跟部分员工将持有11%的股份. 内蒙君正昨晚发布公告称

还记得余额宝背后对接的天弘基金

还记得余额宝背后对接的天弘基金么?昨日,天弘基金确认了最新的股权结构,公司前三大股东分别为:浙江阿里巴巴电子商务有限公司,占股51%:天津信托有限责任公司,占股16.8 %:内蒙古君正能源化工股份有限公司(下文简称内蒙君正),占股15.6%.此外,天弘基金管理层跟部分员工将持有11%的股份. 内蒙君正昨晚发布公告称,其参股公司天弘基金收到中国证监会<关于核准天弘基金管理有限公司变更持有5%以上股权股东的批复>文件,主要内容为:核准浙江阿里巴巴电子商务有限公司向天弘基金出资2.62亿元,持有天弘

还记得微软小冰吗?她都4200万用户了,怎么做到的

前几天微软内部的同学告诉我,微软人工智能机器人小冰的用户已经超过4200万了.依稀还记得2014年5月参加第一代微软小冰的发布会,微软别出心裁的将戏台搬到了室内,让小冰拜师于谦学说话.从0到4200万--这个一直把自己定位为16岁萌妹子的"智能机器人"花了两年的时间. 火热发布后,紧接着小冰就经历了多次质疑与打脸.挣扎与反击,地产大佬潘石屹曾将小冰比作"微博的癌症",很多业内人士也都预言"这个项目活不了很久":"光聊天,用户会很快厌倦&

还记得那个能让弹琴变得更简单的壹枱智能钢琴吗?

摘要: 还记得那个能让弹琴变得更简单的壹枱智能钢琴吗?他们近日向外界宣布 获得了创新工场A轮千万级的投资 . 壹枱是一款降低了购买和学习双重门槛的智能钢琴.在硬件方面,它和钢琴 还记得那个能让弹琴变得更简单的壹枱智能钢琴吗?他们近日向外界宣布获得了创新工场A轮千万级的投资. 壹枱是一款降低了购买和学习双重门槛的智能钢琴.在硬件方面,它和钢琴一样选择了配重的琴键,弹奏时每个琴键上方发光的指示灯区别了其与传统钢琴的本质不同.壹枱不仅支持直接弹奏,还可以通过连接iPad.iPhone使用App来进行培