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