再小谈backgroundWorker

其实很多资料已经对backgroundWorker控件讲的非常的详细了,这篇就当做自己的"脚印",放便以后自己的查看或复习
 这个实例是做文件流的上传下载的部分功能,主要是通过线程来操作流并且加入了已使用时间、时间预测、进度展示
首先是选择文件这个非常简单,有点值的注意的是,通过RunWorkerAsync方法的传参(虽然不支持多个参数,但可以通过自己设计对象来解决)
        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            if (System.IO.File.Exists(openFileDialog1.FileName))
            {               
                backgroundWorker1.RunWorkerAsync(openFileDialog1.FileName as object);
            }
        }
接下来是线程的dowork事件,标注为红色的是已使用时间、时间预测计算,在这里可以看到TimeSpan类(以前自己没用过),它可以根据时、分、秒、毫秒来实例,在这里非常好用。
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {//这个方法和自己写线程时一样,是不能调用form的成员变量的。
            FileStream fileStream = File.OpenRead(e.Argument.ToString());
            long filelength = fileStream.Length % 100;
            long nowread=0;
            int progress = 0;
            byte[] bytefile = new byte[4096];
            backgroundWorker1.ReportProgress(0);
            long last = DateTime.Now.Ticks;
            while (true)
            {
                int bytesRead = fileStream.Read(bytefile, 0, 4096);
                nowread+=bytesRead;
                if (bytesRead == 0) break;
                if (progress != (int)(nowread * 100 / fileStream.Length))
                {
                    progress = (int)(nowread * 100 / fileStream.Length);
                     TimeSpan tt = new TimeSpan(DateTime.Now.Ticks) - new TimeSpan(last);
                    double mini = tt.TotalMilliseconds * 100 / progress - tt.TotalMilliseconds;
                    TimeSpan alreadytime = TimeSpan.FromMilliseconds(tt.TotalMilliseconds);
                    TimeSpan leavetime = TimeSpan.FromMilliseconds(mini);
                    string alreadytimeStr = "";
                    string leavetimeStr = "";
                    if (alreadytime.Days != 0)
                        alreadytimeStr += alreadytime.Days + "天 ";
                    if (alreadytime.Hours != 0)
                        alreadytimeStr += alreadytime.Hours + "小时 ";
                    if (alreadytime.Minutes != 0)
                        alreadytimeStr += alreadytime.Minutes + "分 ";
                        alreadytimeStr += alreadytime.Seconds + "秒 ";
                    if (leavetime.Days != 0)
                        leavetimeStr += leavetime.Days + "天 ";
                    if (leavetime.Hours != 0)
                        leavetimeStr += leavetime.Hours + "小时 ";
                    if (leavetime.Minutes != 0)
                        leavetimeStr += leavetime.Minutes + "分 ";
                        leavetimeStr += leavetime.Seconds + "秒 ";
                        string tt3 = alreadytimeStr + "|" + leavetimeStr;
                    backgroundWorker1.ReportProgress(progress , tt3 as object);
                }
            }
            backgroundWorker1.ReportProgress(100);            
        }
最后的是一个展示,也比较简单,由上面dowork事件调用ReportProgress方法后触发的ProgressChanged事件。
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
           label1.Text = e.ProgressPercentage.ToString();
           progressBar1.Value = e.ProgressPercentage;
            if (e.UserState != null)
           {
               label4.Text = e.UserState.ToString().Split('|')[0];
               label6.Text = e.UserState.ToString().Split('|')[1];
           }

        }
其实这个实例并没有实现上传下载的存储,但那一部分的比较常见(橙色部分加一个把 bytefile存储就可以了)。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BackgroundWorker是一个用于执行异步操作的类。当调用BackgroundWorker.RunWorkerAsync()方法时,会触发DoWork事件,该事件用于执行耗时的操作。需要注意的是,DoWork事件内部的代码运行在非UI线程上,所以应避免在该事件内部与用户界面进行交互。与用户界面交互的操作应放置在ProgressChanged和RunWorkerCompleted事件中。\[1\]\[2\] 另外,BackgroundWorker还提供了ReportProgress方法,用于在执行异步操作的过程中报告进度。当调用BackgroundWorker.ReportProgress(int percentProgress)方法时,会触发ProgressChanged事件。该事件的ProgressChangedEventArgs.ProgressPercentage属性可以接收来自ReportProgress方法传递的percentProgress参数值,而ProgressChangedEventArgs.UserState属性可以接收来自ReportProgress方法传递的userState参数。\[3\] 总之,BackgroundWorker是一个方便的工具,可以帮助我们在后台执行耗时的操作,同时保持用户界面的响应性。 #### 引用[.reference_title] - *1* *3* [BackgroundWorker使用总结](https://blog.csdn.net/CodeRookieGuo/article/details/72723310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C#多线程之BackgroundWorker](https://blog.csdn.net/sinat_31608641/article/details/106116204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值