1

到目前为止,以下是我的代码,当我调用 Dispatcher.BeginInvoke 时遇到问题,它没有在正确的时间处理这些消息

类脚本:

    public void Execute()
    {
        var process = new Process();
        var startinfo = new ProcessStartInfo("cmd.exe", @"/C c:\test\my.bat");

        startinfo.WorkingDirectory = "c:\\test";
        startinfo.RedirectStandardOutput = true;
        startinfo.RedirectStandardError = true;

        startinfo.UseShellExecute = false;
        startinfo.CreateNoWindow = true;
        process.EnableRaisingEvents = true;       

        process.StartInfo = startinfo;
        process.OutputDataReceived += (sender, args) => OutputDataReceived(args.Data);
        process.ErrorDataReceived += (sender, args) => ErrorDataReceived(args.Data);
        process.Exited += Exited;
        process.Start();

        process.BeginOutputReadLine();
        process.BeginErrorReadLine();
        process.WaitForExit();

        int exitCode = process.ExitCode;


       }


    public void OutputDataReceived(string data)
    {
        Logging.Logger.Log("data received in script - " + data);
        // throw event if we have a subscriber, else just return
        if (OnScriptOutPut == null) return;

        allFormattedOutPut += Environment.NewLine;
        allFormattedOutPut += data;
        allRawOutPut += data;

        ScriptOutputEventArgs args = new ScriptOutputEventArgs(data);
        OnScriptOutPut(this, args);
    }

WPF Window 调用脚本类并订阅 OnScriptOutPut 事件

问题如下,UpdateOutPutTextBox 仅在脚本完成后被调用,然后所有 updateoutputtextbox 消息都被一次处理,当调用 begininvoke 时它们不会被处理,导致屏幕在最后而不是在新输出时更新数据已收到..任何帮助表示赞赏!

    private void btnRunScript_Click(object sender, RoutedEventArgs e)
    {
        Script script = new Script();
        script.OnScriptOutPut += script_OnScriptOutPut;

         script.Execute();

    }

    private void script_OnScriptOutPut(object sender, ScriptOutputEventArgs args)
    {
      Application.Current.Dispatcher.BeginInvoke(new Action(() => UpdateOutPutTextBox(args.Data)),System.Windows.Threading.DispatcherPriority.Send);

        Logging.Logger.Log("data received in event ");
    }

    private void UpdateOutPutTextBox(string data)
    {
        Logging.Logger.Log("data received in update "+data);
        tbOutput.Text += Environment.NewLine;
        tbOutput.Text += data;
    }
4

2 回答 2

1

您正在调用ExecuteUI 线程并使用WaitForExit. 然后所有的BeginInvoke动作都排队了。删除对 的调用WaitForExit。如果您需要对退出代码执行某些操作,请在Exited事件处理程序中获取值。

于 2013-07-18T03:41:55.993 回答
-1

我无法浏览整个代码,但是查看您的查询, Dispatcher.BeginInvoke BeginInvoke -> 就像调用 async ,并且异步操作可能需要时间,具体取决于条件,如果可以,请使用 Invoke ,您的代码很多!如果可能的话,重新使用它!

于 2013-07-18T03:39:56.443 回答