Нужна помощь с RX: преобразование System.Diagnostics.Process.OutputDataReceived в Observable - PullRequest
0 голосов
/ 15 мая 2011

Я хочу запустить подпроцесс и посмотреть его перенаправленный вывод.Это не проблема для меня в C #, но я пытаюсь понять RX, поэтому игра начинается ... У меня есть метод статического расширения для процесса, который выглядит следующим образом:

    public static IObservable<IEvent<DataReceivedEventArgs>> GetOutput(this Process that)
    {
        return Observable.FromEvent<DataReceivedEventArgs>(that, "OutputDataReceived");
    }

Я создаю наблюдаемуюи подпишитесь на это так:

    Process p = ........
    var outObs = p.GetOutput();
    var outSub = outObs.Subscribe(data => Console.WriteLine(data));

Это не совсем неправильно, но я получаю:

System.Collections.Generic.Event`1[System.Diagnostics.DataReceivedEventArgs]

, пока я ожидаю получить строки: - (

Так что, я думаю, мой метод расширения возвращает неправильный тип. Было бы очень хорошо, если бы кто-то мог объяснить мне, что не так с моей сигнатурой методов расширения.

Большое спасибо, ++ mabra

1 Ответ

2 голосов
/ 15 мая 2011

Итак, я думаю, мой метод расширения возвращает неправильный тип

Именно так.

IEvent оборачивает как параметры sender, так и EventArgsСобытие делегат традиции.Поэтому вам нужно изменить код так, чтобы он выглядел примерно так:

public static IObservable<string> GetOutput(this Process that)
{
    return Observable.FromEvent<DataReceivedEventArgs>(that, "OutputDataReceived")
                     .Select(ep => ep.EventArgs.Data);
}

Если вы используете последнюю версию Rx, тогда код немного другой

public static IObservable<string> GetOutput(this Process that)
{
       return Observable.FromEventPattern<DataReceivedEventArgs>(that, "OutputDataReceived")
                        .Select(ep => ep.EventArgs.Data);
}

ключ здесь в том, чтобыSelect EventArgs из EventPattern / IEvent, а затем захватить Data

...