2

我正在尝试制作一个充当 Java 应用程序包装器的 C# 应用程序。

我试图实现的功能之一是将控制台输出重定向到我的程序,不幸的是,当我终止我的 Java 进程时,整个程序会冻结。

这是代码:

private void button1_Click(object sender, EventArgs e)
{
    String start = @"myjavaapp.jar";

    var startInfo = new ProcessStartInfo("java", start);

    startInfo.RedirectStandardInput = startInfo.RedirectStandardError = true;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    Process ServerProc = new Process();
    ServerProc.StartInfo = startInfo;
    ServerProc.EnableRaisingEvents = true;
    ServerProc.ErrorDataReceived += new DataReceivedEventHandler(ServerProc_ErrorDataReceived);
    ServerProc.Exited += new EventHandler(ServerProc_Exited);

    ServerProc.Start();
    ServerProc.BeginErrorReadLine();
}

private void ServerProc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    Invoke(new Action(() =>
    {
        if (e.Data.Contains("nastything"))
        {
            System.Windows.Forms.MessageBox.Show("Something nasty happened in console ");
        }
        f2.richTextBox1.AppendText(e.Data + "\n");
    }));
}

我认为我的线程管理有问题 - 也许我还不明白。无论如何,在调试模式下 vs2012 会给我一个NullReferenceException.

4

1 回答 1

0

你可以只使用检查 e.Data!=null 吗?

private void ServerProc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    Invoke(new Action(() =>
    {
        if (e.Data!=null && e.Data.Contains("nastything"))
        {
            System.Windows.Forms.MessageBox.Show("Something nasty happened in console ");
        }
        if (e.Data!=null) f2.richTextBox1.AppendText(e.Data + "\n");
    }));
}

或者使用try-catch。

于 2013-08-16T07:36:59.370 回答