Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 新流程出现故障?_C# - Fatal编程技术网

C# 新流程出现故障?

C# 新流程出现故障?,c#,C#,我无法在这里找到我正在寻找的答案,但如果是,请链接它,我将关闭此重复帖子 作为我正在进行的一个项目的一部分,我希望按以下顺序发生三件简单的事情: 1.)显示字幕进度条 2.)通过CMD在中运行一些命令,并将输出移动到可访问的字符串 3.)停止/隐藏进度条 我看到的问题是,我的代码没有按顺序执行,我非常困惑为什么。这似乎是第2-1-3步,这是不可能的 更奇怪的是,如果我在第1步和第2步之间取消对消息框的注释,事情就会按顺序执行 新的CMD流程是否有什么让它变得古怪的地方 以下是我的此方法代码:

我无法在这里找到我正在寻找的答案,但如果是,请链接它,我将关闭此重复帖子

作为我正在进行的一个项目的一部分,我希望按以下顺序发生三件简单的事情:

1.)显示字幕进度条 2.)通过CMD在中运行一些命令,并将输出移动到可访问的字符串 3.)停止/隐藏进度条

我看到的问题是,我的代码没有按顺序执行,我非常困惑为什么。这似乎是第2-1-3步,这是不可能的

更奇怪的是,如果我在第1步和第2步之间取消对消息框的注释,事情就会按顺序执行

新的CMD流程是否有什么让它变得古怪的地方

以下是我的此方法代码:

        //STEP 1 - Updates label and starts progress bar
        lblSelectDiagnostic.Text = "Diagnostic Running";
        progressBarDiag.Visible = true;
        progressBarDiag.MarqueeAnimationSpeed = 100;

        //MessageBox.Show("Status Updated");

        //STEP 2 - Runs "Test Internet Connection"

        //Gets selected diagnostic name
        string strSelectedDiag = listBoxDiagnostics.SelectedItem.ToString();
        var name = strSelectedDiag.Substring(strSelectedDiag.LastIndexOf(':') + 1);
        strSelectedDiag = name.Trim();

        if (strSelectedDiag.Contains("Test Internet Connection"))
        {
            //Pings Google
            ProcessStartInfo info = new ProcessStartInfo();
            info.RedirectStandardError = true;
            info.RedirectStandardInput = true;
            info.RedirectStandardOutput = true;
            info.UseShellExecute = false;
            info.FileName = "cmd.exe";
            info.CreateNoWindow = true;
            //Creates new process
            Process proc = new Process();
            proc.StartInfo = info;
            proc.Start();
            //Writes commands
            using (StreamWriter writer = proc.StandardInput)
            {
                if (writer.BaseStream.CanWrite)
                {
                    writer.WriteLine("ping www.google.com");
                    writer.WriteLine("exit");
                }
                writer.Close();
            }
            string PingGoogle = proc.StandardOutput.ReadToEnd();
            proc.Close();
        }

        //STEP 3 - Resets label and stops progress bar
        progressBarDiag.MarqueeAnimationSpeed = 0;
        progressBarDiag.Visible = false;
        lblSelectDiagnostic.Text = "Select Diagnostic to Run:";

-谢谢

进度条不会显示,因为您正在逻辑所在的同一线程中绘制进度条。您必须在另一个线程中执行此操作。最简单的方法是使用后台工作人员


这将对您有所帮助:

如果您在单个线程(UI线程)上运行所有内容,则UI将在您返回后才会更新。您没有显示足够的代码来确认这是否正确,但您正在与(看起来像什么)UI元素交互这一事实使其成为可能。当您在必须绘制进度条的同一线程上运行代码时,您不会看到进度条动画。当您抛出一个允许处理绘制事件的消息框时,就会出现混乱。您的方法根本上是有缺陷的,在一个单独的工作线程中运行昂贵的代码,这样就不会使UI线程陷入困境。BackgroundWorker始终是一个不错的选择。我不熟悉BackgroundWorker类,我如何构造步骤2来运行它?我尝试了thread.Sleep(500),甚至thread.Sleep(2000),但没有任何区别。这是因为您的睡眠导致UI线程睡眠。BackgroundWorker在一个单独的线程中运行,允许UI线程跟踪消息。这很有意义。虽然我不熟悉BackgroundWorker类,但如何编写步骤2以使用它运行,但仍然能够从主线程访问PingGoogle字符串?