将进度条与函数 C# 同步

本文关键字:函数 同步 | 更新日期: 2023-09-27 18:36:04

首先,我的代码是用Windows Form Application - C#编写的。

我需要执行一个方法(这是非常模块化的,它的运行时间取决于您在系统中使用的物理内存量),当此方法运行时,我想向用户显示一个进度条。我不知道如何将进度条与函数的运行时同步。

编辑:这是我的代码:

public SystemProp()
    {
        // Getting information about the volumes in the system.
        this.volumes = getVolumes();
        for (int i = 0; i <volumes.Length; i++)
        {
            // Create a txt file for each volume.
            if (!System.IO.File.Exists(dirPath + volumes[i].Name.Remove(1) + @".txt"))
            {
                using (FileStream fs = File.Create(dirPath + volumes[i].Name.Remove(1) + @".txt"))
                {
                }
            }
            // Treescan function for each Volume.
            TreeScan(volumes[i].Name);
        }
    }
    private bool isSafe()
    { return true; }
    private DriveInfo[] getVolumes()
    {
        DriveInfo[] drives = DriveInfo.GetDrives();
        return drives;
    }
    private void TreeScan(string sDir)
    {
       try
       {
            foreach (string f in Directory.GetFiles(sDir))
            {
                using (FileStream aFile = new FileStream(dirPath + sDir.Remove(1) + @".txt", FileMode.Append, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(aFile)) { sw.WriteLine(f); }
            }
            foreach (string d in Directory.GetDirectories(sDir))
            {
                TreeScan(d);
            }
       }
       catch (Exception)
       { }
    }

函数是树扫描。

我会感谢任何形式的帮助,谢谢!!

将进度条与函数 C# 同步

您应该计算进度并在方法中设置ProgressBar.Value

例如,您有一个从 1 到 100 的 for 循环。

for (int i = 0; i < 100; i ++) 
{
 //...
 progressBar.Value = i;
}

您还可以使用 Maximum 属性设置进度的最大值。因此,对于从 1 到 10 的 for 循环,您可以将最大值设置为 10,并且不计算进度。

progressBar.Maximum = 10;
for (int i = 0; i < 10; i ++) 
{
 //...
 progressBar.Value = i;
}

如果无法将方法拆分到可以更改进度值的不同阶段,则可以创建一个每秒滴答一次的计时器,并在 Tick 事件处理程序中更改进度值。为了根据运行时设置进度值,您可以使用Stopwatch 。计时器和秒表应在方法的开头启动。

    Timer timer = new Timer();
    Stopwatch stopwatch = new Stopwatch();
    void Method()
    {
        timer.Start();
        stopwatch.Start();
        //...
    }
    private void Timer_Tick(object sender, EventArgs e)
    {
        var progress = CalculateProgress (); // calculate progress  
        progressBar.Value = progress; 
        // or
        progressBar.Value =  stopwatch.Elapsed.Seconds;
    }