添加进度条查看进度百分比在C#中的过程(Add progressBar to view progre

2019-08-16 22:22发布

这是关于我的过程代码:

StreamReader outputReader = null;
StreamReader errorReader = null;


       ProcessStartInfo processStartInfo = new ProcessStartInfo(......);
       processStartInfo.ErrorDialog = false;

       //Execute the process
        Process process = new Process();
        process.StartInfo = processStartInfo;
        bool processStarted = process.Start();

                     if (processStarted)
                        {
                        //Get the output stream
                        outputReader = process.StandardOutput;
                        errorReader = process.StandardError;


                        //Display the result
                        string displayText = "Output" + Environment.NewLine + "==============" + Environment.NewLine;
                        displayText += outputReader.ReadToEnd();
                        displayText += Environment.NewLine + Environment.NewLine + "==============" +
                                       Environment.NewLine;
                        displayText += errorReader.ReadToEnd();
                        // txtResult.Text = displayText;
                    }

我需要添加进度到我的表格计算进度百分比,这个过程中,但我不知道该怎么办。

即时通讯使用Visual Studio 2012,Windows窗体。

Answer 1:

使用过程OutputDataReceived事件捕获进度。 (假设过程给予任何形式的更新)。 你可以格式化初始输出返回增量的总数,然后撞击每个输出事件的进展或实际解析输出数据,以确定当前的进度。

在这个例子中来自过程的输出将最大设置,并且每一个随后的步骤将凸点它。

progressBar1.Style = ProgressBarStyle.Continuous;
// for every line written to stdOut, raise a progress event
int result = SpawnProcessSynchronous(fileName, args, out placeholder, false,
    (sender, eventArgs) =>
    {
        if (eventArgs.Data.StartsWith("TotalSteps=")
        {
          progressBar1.Minimum = 0;
          progressBar1.Maximum = Convert.ToInt32(eventArgs.Data.Replace("TotalSteps=",""));
          progressBar1.Value = 0;
        }
        else
        {
          progressBar1.Increment(1);
        }
    });


public static int SpawnProcessSynchronous(string fileName, string args, out string stdOut, bool isVisible, DataReceivedEventHandler OutputDataReceivedDelegate)
{
    int returnValue = 0;
    var processInfo = new ProcessStartInfo();
    stdOut = "";
    processInfo.FileName = fileName;
    processInfo.WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? "";
    log.Debug("Set working directory to: {0}", processInfo.WorkingDirectory);

    processInfo.WindowStyle = isVisible ? ProcessWindowStyle.Normal : ProcessWindowStyle.Hidden;
    processInfo.UseShellExecute = false;
    processInfo.RedirectStandardOutput = true;
    processInfo.CreateNoWindow = true;

    processInfo.Arguments = args;
    using (Process process = Process.Start(processInfo))
    {
        if (OutputDataReceivedDelegate != null)
        {
            process.OutputDataReceived += OutputDataReceivedDelegate;
            process.BeginOutputReadLine();
        }
        else
        {
            stdOut = process.StandardOutput.ReadToEnd();
        }
        // do not reverse order of synchronous read to end and WaitForExit or deadlock
        // Wait for the process to end.  
        process.WaitForExit();
        returnValue = process.ExitCode;
    }
    return returnValue;
}


Answer 2:

一个普通的进程没有内置的机制来提供进度通知。 你需要找出一些方法的过程中,你已经开始通知其进展。

如果你控制这个过程中,你可能把它写入标准输出或标准错误,并使用

outputReader = process.StandardOutput;
errorReader = process.StandardError;

您已经定义了阅读的进展回你的程序。 例如,该过程可以写为标准错误

10
31
50
99

和你的父进程,阅读errorReader ,可以解释那些个别线路如%完成。

一旦你获得%完成子进程的一种手段,你可以使用一个进度条来显示进度。



文章来源: Add progressBar to view progress percentage to a process in c#