2010-11-07 8 views
5

Nie będę podawać całego kodu, ale przykład tego, co chcę zrobić. Mam ten kod do aktualizacji elementów GUI ze stderr zewnętrznych procesów.Jak przekazywać obiekty między wątkami podczas uruchamiania procesu System.Diagnostics

skonfigurować mój proces takiego:

ProcessStartInfo info = new ProcessStartInfo(command, arguments); 

// Redirect the standard output of the process. 
info.RedirectStandardOutput = true; 
info.RedirectStandardError = true; 
info.CreateNoWindow = true; 

// Set UseShellExecute to false for redirection 
info.UseShellExecute = false; 

proc = new Process(); 
proc.StartInfo = info; 
proc.EnableRaisingEvents = true; 

// Set our event handler to asynchronously read the sort output. 
proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived); 
proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived); 
proc.Exited += new EventHandler(proc_Exited); 

proc.Start(); 

// Start the asynchronous read of the sort output stream. Note this line! 
proc.BeginOutputReadLine(); 
proc.BeginErrorReadLine(); 

Mam następnie obsługi zdarzeń

void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    if (e.Data != null) 
    { 
     UpdateTextBox(e.Data); 
    } 
} 

Które wywołuje następujące dane, które odwołuje się do konkretnej kontroli tekstowym.

private void UpdateTextBox(string Text) 
{ 
    if (this.InvokeRequired) 
     this.Invoke(new Action<string>(this.SetTextBox), Text); 
    else 
    { 
     textBox1.AppendText(Text); 
     textBox1.AppendText(Environment.NewLine); 
    } 
} 

Co chcę jest coś takiego:

private void UpdateTextBox(string Text, TextBox Target) 
{ 
    if (this.InvokeRequired) 
     this.Invoke(new Action<string, TextBox>(this.SetTextBox), Text, Target); 
    else 
    { 
     Target.AppendText(Text); 
     Target.AppendText(Environment.NewLine); 
    } 
} 

że mogę użyć do aktualizacji z różnych pól tekstowych z tego wątku, bez konieczności tworzenia funkcji oddzielna dla każdej kontroli w GUI.

Czy to możliwe? (oczywiście powyższy kod nie działa poprawnie)

Dzięki.

UPDATE:

private void UpdateTextBox(string Text, TextBox Target) 
{ 
    if (this.InvokeRequired) 
     this.Invoke(new Action<string, TextBox>(this.**UpdateTextBox**), Text, Target); 
    else 
    { 
     Target.AppendText(Text); 
     Target.AppendText(Environment.NewLine); 
    } 
}  

Kod ten wydaje się działać jak teraz zauważyłem literówkę .. to jest ok używać?

+0

Właściwie wygląda na to, że to działa, po prostu nie zmieniłem SetTextBox na UpdateTextBox, kiedy go skopiowałem i wkleiłem. – dave

+0

Czy mógłbyś wyjaśnić problem, którego doświadczasz? –

+0

Działa, ale jeśli wstawię tam przerwę i przyjrzę się "Celowi" w IDE, oznacza to, że "Target.Text" rzucił wyjątek typu "Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException" " – dave

Odpowiedz

1

Podany kod wygląda dobrze i jest dobrym sposobem na wysłanie takich wiadomości między wątkami.

Powiązane problemy