例如,作为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)
{
}
答案 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