[英]How can i add a time elapsed progrerss to my backgroundworker dowork event?
在form1的顶部
label5.Text = "00:00:00";
在dowork事件中
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DirectoryInfo diri = new DirectoryInfo(@"d:\c-sharp");
WalkDirectoryTree(diri);
}
WalkDirectoryTree方法
int tfiles = 0;
int tdirs = 0;
void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
System.IO.FileInfo[] files = null;
System.IO.DirectoryInfo[] subDirs = null;
string[] workerResult = new string[4];
try
{
files = root.GetFiles("*.cs");
tdirs ++;
workerResult[1] = root.FullName;
workerResult[3] = tdirs.ToString();
backgroundWorker1.ReportProgress(0,workerResult);
}
catch (UnauthorizedAccessException e)
{
}
catch (System.IO.DirectoryNotFoundException e)
{
}
if (files != null)
{
foreach (System.IO.FileInfo fi in files)
{
tfiles += files.Length;
if (files.Length > 0)
{
try
{
int Vara = File.ReadAllText(fi.FullName).Contains("Form1") ? 1 : 0;
if (Vara == 1)
{
workerResult[2] = files[0].FullName;
}
}
catch (FileNotFoundException e)
{
}
}
workerResult[0] = tfiles.ToString();
backgroundWorker1.ReportProgress(0, workerResult);
Thread.Sleep(10);
}
subDirs = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
WalkDirectoryTree(dirInfo);
}
}
}
在构造函数中,我启动了背景工作人员
InitializeComponent();
label1.Visible = false;
label2.Visible = false;
label3.Visible = false;
label4.Visible = false;
label5.Text = "00:00:00";
pbt.Size = new Size(984, 23);
pbt.Location = new Point(12, 358);
this.Controls.Add(pbt);
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();
我想让背景工作人员启动整个过程后,便会在dowork事件报告中开始以标记经过的时间。
首先,我该怎么做? 我应该使用计时器还是秒表?
由于您要测量一个进程所花费的时间,因此根据定义,您应该使用System.Diagnostics.Stopwatch
类。 MSDN将其定义为 :
秒表类
提供一组方法和属性,可用于准确测量经过的时间。
但是,您还需要窗体上的System.Windows.Forms.Timer
控件,以便在工作进行时更新字段。 计时器的“ Interval
属性控制您要多久更新一次字段,但不要依赖于此来确定要显示的实际值。 而是使用秒表的Elapsed
属性。
在窗体上放置一个Timer
。
在C#代码中创建秒表类的实例:
private readonly Stopwatch _stopwatch = new Stopwatch();
在调用RunWorkerAsync()
,请调用timer1.Start()
在后台工作者的DoWork
事件中:
_stopwatch.Restart(); // do your work _stopwatch.Stop();
在计时器的Tick
事件中,用秒表的Elapsed
属性的值更新标签。 格式化它随便你喜欢。
lblElapsed.Text = _stopwatch.Elapsed.ToString(@"hh\\:mm\\:ss\\.f");
在RunWorkerCompleted
事件中,调用timer1.Stop()
我将捕获当前时间在变量或字段上,并在调用RunWorkerAsync
之前启动计时器。 在计时器的每个刻度上,使用经过的时间(当前时间减去捕获的开始时间)更新标签。 当工作者使用RunWorkerCompleted
事件结束时,停止计时器。
如果您要谈论的是仅显示BackgroundWorker
完成工作所需的总时间(即不显示增量更新):
在调用RunWorkerAsync
之前,先获取一个时间戳记(例如, DateTime.UtcNow
,如果您不需要毫秒级的精度)。 将此值传递到RunWorkerAsync
方法中(使用接受object
参数的重载)。 在您的表单中捕获RunWorkerCompleted
事件,然后从那些事件args的UserState
属性中检索时间戳。 将标签设置为当前时间的增量减去UserState
的时间戳。
例如:
backgroundWorker1.RunWorkerAsync(DateTime.UtcNow);
// elsewhere in your form:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
_myLabel.Text = DateTime.UtcNow - (DateTime)e.UserState;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.