繁体   English   中英

我该如何为我的backgroundworker dowork事件添加经过时间的编程器?

[英]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属性。

  1. 在窗体上放置一个Timer

  2. 在C#代码中创建秒表类的实例:

     private readonly Stopwatch _stopwatch = new Stopwatch(); 
  3. 在调用RunWorkerAsync() ,请调用timer1.Start()

  4. 在后台工作者的DoWork事件中:

     _stopwatch.Restart(); // do your work _stopwatch.Stop(); 
  5. 在计时器的Tick事件中,用秒表的Elapsed属性的值更新标签。 格式化它随便你喜欢。

     lblElapsed.Text = _stopwatch.Elapsed.ToString(@"hh\\:mm\\:ss\\.f"); 
  6. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM