1

現在のプロジェクトでは、コマンドプロンプトを使用して、textBoxに入力された入力に基づいて、リッチテキストボックスに表示し、ボタンを押しています。

コマンドプロンプト出力をwinformにリダイレクトする際のProcessクラスの問題を参照してください。

私が行いたい小さな更新の1つ(特に小さな更新コードではないかもしれません-wize)は、コマンドプロンプトが実行している間、ボタンを「無効」状態にすることです。プロジェクトは「Control.BeginInvoke」を使用してrichTextBoxのテキストを更新するため、「ファイアアンドフォーゲット」を実行します。これは、すべての「BeginInvokes」がUIに対して処理された後、無効にされたボタンを再度有効にする方法が実際にはないことを意味します。

問題は、すべての「BeginInvokes」が実行されたらコールバックを取得して、「これで完了です。ボタンを元に戻します」と言うことは可能かと思います。これにより、ユーザーがボタンを押して重複プロセスを送信するのを防ぐことができます。

これが私が使用しているコードのスニペットです:

public void GetConsoleOuput(string command = null)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "cmd.exe";
    startInfo.RedirectStandardOutput = true;
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;

    if (!string.IsNullOrEmpty(command))
    {
        startInfo.Arguments = command;
    }

    Process process = new Process();
    process.StartInfo = startInfo;
    process.OutputDataReceived += new DataReceivedEventHandler(AppendRichBoxText);

    process.Start();
    process.BeginOutputReadLine();
    process.Close();
}

public void AppendRichBoxText(object sendingProcess, DataReceivedEventArgs outLine)
{
    string outputString = args.Data;
    MethodInvoker append = () => richTextBox.AppendText(outputString);
    richTextBox.BeginInvoke(append);
}

// Would like EventHandler method to enable button once all "BeginInvokes" are
// done running asynchronously due to a callback.
public void EnableButton
{
    /// re-enable a disabled button
}
4

1 に答える 1

0

BeginInvokeすべての更新の後でもう一度電話して、EnabledButton後で電話してください。

于 2011-10-11T22:55:28.933 に答える