在事件处理程序中将Process类(发送者)线程强制转换为....

时间:2010-02-09 23:01:15

标签: c# backgroundworker

例如,作为BackgroundWorker的线程可以像:

一样进行转换
private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        System.ComponentModel.BackgroundWorker senderWorker
                = sender as System.ComponentModel.BackgroundWorker;
    } 

上面的代码代表了我对后台工作线程的所有代码。我把[发送者]当作BackGround工作者 - 因为我知道他是什么。

我似乎无法找到我应该将其投射到以下内容:而不是后台工作者,如果我使用了Process类,并执行说DOS批处理文件,使用:

enter code here

Process proc = new Process(); proc.FileName =“some_dos_batch_file.bat”; proc.Exited = ProcessExited; proc.Start();

对语法很抱歉,但是当此过程完成时,其完成将由下面的“ProcessExited”处理。但是,在这种情况下,我应该将发送者arg强制转换为什么 - 显然不是背景工作者,但我不确定是什么?我想使用.Results属性,就像我对Background worker一样。

谢谢 - 抱歉混淆。

enter code here




    void ProcessExited(object sender, EventArgs e)

    {
     }

2 个答案:

答案 0 :(得分:1)

我希望我理解你的问题,如果没有,请澄清。如果你正在讨论线程并使用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);
    }
}

如果你要在一个线程中运行它,那么Process的事件仍会被捕获( 仅在线程本身 ),但是如果你在谈论等待要完成的线程,请看一下这个名为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来表示在线程的上下文中说“对,我完成了,回到创建者......”

答案 1 :(得分:0)

为什么不能转换为Process对象?您仍然可以访问已终止的Process对象的某些成员,例如ExitCode或ExitTime。

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