处理ErrorDataReceived时出现NullReferenceException - 被杀死的线程

时间:2013-08-15 21:09:30

标签: c# multithreading

我正在尝试创建一个充当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

1 个答案:

答案 0 :(得分: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。