C#读取文件的实时进度条

原创 2016年07月18日 11:49:16

C#读取文件的实时进度条

对线程及其线程间通讯,线程访问UI控件的问题没有任何经验,通过编写读取文件的实时进度条来增加一些此方面的基础知识。

  • 目的
    写过一个用Redis存取数据的小项目,Redis的持久化机制导致在机器crash掉的时候可能会丢失数据,项目也有把检测到的数据写入txt的需求,由于数据txt写入是实时的(每获取一条记录,就写入一条),所以机器crash掉的时候,数据的恢复可以通过读取生成的txt文件来恢复到数据库。由于数据比较多,等待过程漫长,为了增加用户体验以及跟踪实时进度,于是自己想写一个实时进度条。

待解决问题

  • 进度条的总进度的获取
  • 如何获取当前读取的进度
  • 进度条实时更新
  • 用多线程解决单线程操作UI页面卡顿问题

思路

进度条的总进度有两种定义:总进度为txt文本文件的行数(数据都是按照行写入),文本文件的大小。如果用文本文件的行数来定义总进度,会导致要通过代码获取文本文件的总行数,计算行数与读取+存储Redis用到了完全相同的代码,这样导致了两次完全相同文件读取,牺牲了一半的效率。通过计算文本文件的大小来定义总长度,每次在读取到一条数据是计算出数据占文本文件大小的百分比,就得到了本次读取的进度。
.NET禁止了跨线程调用控件,要通过UI对象的invoke方法,反射调用UI控件的方法。
通过线程间接更改UI控件,UI控件就不会卡顿未响应

ManualResetEvent eventX = new ManualResetEvent(false);//控制线程状态
//获取文件大小
 private long len;
private long redlen;
//获取文件大小(多个文件)
private void readFile()
{
    DirectoryInfo di = new DirectoryInfo(restoreFilePath);
    foreach (FileInfo fi in di.GetFiles())
    {
        len += fi.Length;
    }
    string s = (len / 32).ToString();
}
//从线程池取线程,用该线程读取文件并存储到redis,直至文件读取完毕,退出线程
public void circleRead()
{
    //files是一个存储txt文件路径的列表
    fs = new FileStream(files[index], FileMode.Open);
    sr = new StreamReader(fs);
    readFile();
    eventX.WaitOne();
    while (index < fileCount)
    {
        eventX.Reset();
        ThreadPool.QueueUserWorkItem(new WaitCallback(changeUIPGBar),new object());
        eventX.WaitOne();//直到接收到Set通知,否则阻塞线程
    }
    this.Invoke(new updateLbl(updateState),new object[]{"导入完成"});
}

private void button2_Click(object sender, EventArgs e)
{
//启动一个线程去执行循环读取的线程,异步更新UI界面,这样就不会出现UI线程卡顿
    Thread t = new Thread(circleRead);
    t.IsBackground = true;
    t.Start();
}

比较重要的方法和数名已经在代码中作出注解

关于后台更新UI线程控件与卡顿问题将会再调查,调查完毕会写博客论述

版权声明:本文为博主原创文章,未经博主允许不得转载。

VS2010-MFC下在状态栏中添加进度条用于显示当前文件的读取进度

VS2010-MFC在状态栏上添加进度条比在VC6.0中更加简单,不需要再从CStatusBar类中派生子类。 仔细查看VS2010生成的MainFrm.h文件我们可以看出,m_wndStatusB...
  • HW140701
  • HW140701
  • 2017年03月19日 15:01
  • 1945

Process进程 ; Thread线程 (拷贝文件,带进度条的使用实例)

前台线程和后台线程 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi...
  • Fanbin168
  • Fanbin168
  • 2014年12月23日 17:37
  • 2080

c#大文件读取和写入数据库(带进度条的源代码)

protected int state = 0; //表示进度条当前处理的事件类型,1表读取word,2表写入word,3表doc转pdf,4表txt转pdf private System.Wi...
  • gui597651737
  • gui597651737
  • 2012年10月13日 15:25
  • 2092

c#大文件读取和写入数据库(带进度条的源代码)

  • 2011年05月26日 11:39
  • 62KB
  • 下载

c#大文件读取和写入数据库(带进度条的源代码).pdf

  • 2015年06月29日 11:20
  • 2.08MB
  • 下载

springmvc上传文件实时显示进度条

  • 2017年11月28日 16:47
  • 610KB
  • 下载

c#做的一个简单的包含实时进度的进度条

运行效果如图。
  • u011609113
  • u011609113
  • 2014年08月26日 20:51
  • 1086

C# 拷贝文件时的进度条

  • 2011年08月21日 22:30
  • 2KB
  • 下载

实现文件传输进度条功能,C#版

  • 2010年04月09日 16:01
  • 139KB
  • 下载

c# 进度条BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作

BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作。 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖...
  • mywaster
  • mywaster
  • 2015年11月22日 14:17
  • 1014
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#读取文件的实时进度条
举报原因:
原因补充:

(最多只允许输入30个字)