Как обрабатывать ошибки, возвращаемые классом Process? - PullRequest
0 голосов
/ 25 октября 2018

Я использую прокси-класс, в котором я обертываю экземпляр Process, я реализовал событие ErrorDataReceived, которое перенаправляет в реальное событие Process.Но в любом случае - даже без прокси-класса - я просто не понимаю, как использовать это событие.

Проблема в том, что static Process.Start () возвращает экземпляр Process, к которому я могу подключить свойобработчики событий.Таким образом, в основном я не могу подписаться на событие до того, как процесс был запущен, но тогда у меня нет ничего, на что можно подписаться, и в моем случае это дает мне исключение NullReferenceException, потому что мой обернутый экземпляр Process в этот момент равен нулю.

Но могу ли я быть уверен, что ошибка еще не произошла между вызовом и подпиской?Кто-нибудь знает лучшее решение, чтобы ловить ошибки?Этот процессный класс доставляет мне немало хлопот, есть несколько способов сделать что-то, но сом мне не совсем понятен.Также чтение ErrorOutputStream блокирует приложение, если нет ошибок ...

Немного контекста:

public class ProcessProxy : IProcessProxy
{
    private object lockObject = new object();

    public Process Process { get; private set; }

    public void Start(ProcessStartInfo processStartInfo)
    {
        Process = Process.Start(processStartInfo);
    }

    public bool WaitForExit(int milliseconds)
    {
        return Process.WaitForExit(milliseconds);
    }

    public event DataReceivedEventHandler ErrorDataReceived
    {
        add
        {
            lock (lockObject)
            {
                Process.ErrorDataReceived += value;
            }
        }
        remove
        {
            lock (lockObject)
            {
                Process.ErrorDataReceived -= value;
            }
        }
    }
}

Если я сделаю s.th.например, тогда это, очевидно, исключение NullReferenceException, поскольку внутренний объект Process имеет значение null:

AprocessProxy.ErrorDataReceived += OnError;
processProxy.Start(ProcessStartInfo);

1 Ответ

0 голосов
/ 25 октября 2018

Используйте new для создания экземпляра Process, подключите обработчик событий, а затем запустите процесс, вызвав метод Start для этого экземпляра.

...