使用功能C#同步进度条

时间:2016-02-23 20:38:21

标签: c#

首先,我的代码是用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)
       { }

    }

该功能是树木扫描。

我会赞美任何形式的帮助, 非常感谢!!

1 个答案:

答案 0 :(得分:0)

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

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

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

您还可以使用Maximum属性设置进度的最大值。 因此,对于从1到10的for循环,您可以将Maximum设置为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;
    }