Как передавать объекты между потоками при запуске процесса System.Diagnostics - PullRequest
5 голосов
/ 07 ноября 2010

Я не буду предоставлять весь код, но пример того, что я хочу сделать. У меня есть этот код для обновления элементов графического интерфейса из внешних процессов stderr.

Я настроил свой процесс так:

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();

У меня есть обработчик событий

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

Что вызывает следующее, которое ссылается на определенный элемент управления textbox.

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

Я хочу что-то вроде этого:

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);
    }
}

Это можно использовать для обновления различных текстовых полей из этого потока без необходимости создания отдельной функции для каждого элемента управления в графическом интерфейсе.

Возможно ли это? (очевидно, что приведенный выше код работает некорректно)

Спасибо.

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);
    }
}     

Похоже, этот код работает сейчас, так как я заметил опечатку ... это нормально для использования?

Ответы [ 2 ]

1 голос
/ 07 ноября 2010

Код, который вы предоставили, выглядит хорошо и является хорошим способом отправки таких сообщений между потоками.

0 голосов
/ 09 ноября 2010

Взгляните на это.

http://weblogs.asp.net/justin_rogers/pages/126345.aspx

Я делал это раньше, но сейчас у меня нет с собой кода.

еслиЯ получу это, я опубликую это для вас, но статья может иметь достаточно информации, чтобы вы могли выяснить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...