Что преобразовывать поток класса (отправителя) процесса в .... в обработчике событий - PullRequest
0 голосов
/ 10 февраля 2010

Например, поток, который является BackgroundWorker, может быть приведен как:

private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        System.ComponentModel.BackgroundWorker senderWorker
                = sender as System.ComponentModel.BackgroundWorker;
    } 

Приведенный выше код представляет то, что у меня есть для моего фонового рабочего потока. Я использую [отправителя] как BackGround Worker - потому что я знаю, что он такой.

Я не могу найти то, к чему я должен привести это, если: вместо Фонового работника, что если бы я использовал класс Process и выполнил, скажем, пакетный файл DOS, используя:

enter code here

Process proc = новый Process (); proc.FileName = "some_dos_batch_file.bat"; proc.Exited = ProcessExited; proc.Start ();

Извините за синтаксис, но когда этот процесс завершится, его завершение будет обработано ProcessExited ниже. Но к чему я должен привести аргумент отправителя в этом случае - очевидно, что он НЕ Фоновый Работник, но я не уверен, к чему? Я хотел бы использовать свойство .Results так же, как и для фонового работника.

Спасибо - извините за путаницу.

enter code here




    void ProcessExited(object sender, EventArgs e)

    {
     }

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Надеюсь, я понял ваш вопрос, если нет, уточните, пожалуйста. Если вы говорите о многопоточности и использовании System.Diagnostics.Process, то вам нужно использовать события Thread ... рассмотрим это ниже простого класса под названием TestARP, который отправляется в командную строку, используя скрытое окно для получения MAC / IP. адрес активного соединения с выводом команды, перенаправленной в поток, который добавляется к экземпляру stringbuilder:

public class TestARP
{
    private StringBuilder sbRedirectedOutput = new StringBuilder();
    public string OutputData
    {
        get { return this.sbRedirectedOutput.ToString(); }
    }
    public void Run()
    {
        System.Diagnostics.ProcessStartInfo ps = new System.Diagnostics.ProcessStartInfo();
        ps.FileName = "arp";
        ps.ErrorDialog = false;
        ps.Arguments = "-a";
        ps.CreateNoWindow = true;
        ps.UseShellExecute = false;
        ps.RedirectStandardOutput = true;
        ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

        using (System.Diagnostics.Process proc = new System.Diagnostics.Process())
        {
            proc.StartInfo = ps;
            proc.Exited += new EventHandler(proc_Exited);
            proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(proc_OutputDataReceived);
            proc.Start();
            proc.WaitForExit();
            proc.BeginOutputReadLine();
            while (!proc.HasExited) ;
        }
    }

    void proc_Exited(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("proc_Exited: Process Ended");
    }

    void proc_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
    {
        if (e.Data != null) this.sbRedirectedOutput.Append(e.Data + Environment.NewLine);
        //System.Diagnostics.Debug.WriteLine("proc_OutputDataReceived: Data: " + e.Data);
    }
}

Если вы запустите это в потоке, события процесса все равно будут перехвачены ( только в самом потоке ), но если вы говорите об ожидании потока чтобы закончить, посмотрите на этот код класса здесь, называемый ThreadTestARP, который запускает вышеупомянутый класс в потоке ...

public class ThreadTestARP
{
    private TestARP _testARP = new TestARP();
    private ManualResetEvent _mre = new ManualResetEvent(false);
    public ThreadTestARP()
    {
    }
    public TestARP ARPTest
    {
        get { return this._testARP; }
    }
    public void Run()
    {
        Thread t = new Thread(new ThreadStart(RunThread));
        t.Start();
        this._mre.WaitOne();
        // Blocks here...
        t.Join();
    }
    private void RunThread()
    {
        this._testARP.Run();
        this._mre.Set();
    }
}

Обратите внимание, как ManualResetEvent _mre используется, чтобы сигнализировать о том, чтобы сказать в контексте потока: «Хорошо, я закончил, назад создателю ...»

0 голосов
/ 10 февраля 2010

Почему вы не можете привести к объекту Process? Вы по-прежнему можете обращаться к некоторым членам объектов Process, таким как ExitCode или ExitTime, которые были прекращены.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited.aspx

...