0

ここで探している答えを見つけることができませんでしたが、もしそうならリンクしてください。この重複した投稿を閉じます。

私が取り組んでいるプログラムの一部として、次の 3 つの単純なことをこの順序で実行したいと考えています。

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:";

-ありがとう!

4

1 に答える 1

1

進行状況バーは、ロジックと同じスレッドでペイントしているため、表示されません。これは別のスレッドで行う必要があります。最も簡単な方法は、バックグラウンドワーカーを使用することです

これが役に立ちます: http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

于 2013-02-13T21:08:39.683 に答える