2013-08-15 4 views
1

Java 응용 프로그램 래퍼 역할을하는 C# 응용 프로그램을 만들려고합니다.ErrorDataReceived - 죽인 스레드를 처리하는 동안 NullReferenceException이 발생했습니다.

구현하려고하는 기능 중 하나는 콘솔 출력을 내 프로그램으로 리디렉션하는 것입니다. 불행히도 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

당신이 NullReferenceException을 리턴한다고 말할 때 - 어떤 라인에서 이것이 발생합니까? – Slugart

+0

ServerProc_ErrorDataReceived에서 전체 호출 블록입니다. – jmwierzbicki

+1

null, e는 무엇입니까? e.Data? – Slugart

답변

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를 사용하십시오.

관련 문제