确定哪个线程触发事件
本文关键字:事件 线程 | 更新日期: 2023-09-27 18:31:41
我目前正在处理一个c#项目,该项目使用System.Diagnostic.Process方法在配置文件中启动几个脚本。
我有一个 foreach 循环,它通过创建新线程、设置进程信息并启动进程并将该脚本的输出重定向到 c# 程序中来循环访问它需要启动的每个脚本。然后,我使用 Process.OutputDataReceived 事件在程序接收输出时触发。
有没有办法在 OutputDataReceived 事件处理程序中确定触发事件的线程的名称。
下面的代码创建线程并启动线程。
public void prepareProductStart()
{
foreach ( ConfigManagement.ProductSettings product in configManagement.productSettings )
{
worker = new Thread(() => startProducts(product.startScript));
worker.IsBackground = false;
worker.Name = product.productName;
worker.Start();
}
当线程启动时,它会调用此方法,这将触发输出事件
private void startProducts(string startScript)
{
//Thread productThread = new Thread();
Process startProductProcess = new Process();
startProductProcess.StartInfo.FileName = startScript;
startProductProcess.StartInfo.UseShellExecute = false;
startProductProcess.StartInfo.RedirectStandardOutput = true;
StringBuilder processOutput = new StringBuilder("");
startProductProcess.OutputDataReceived += new DataReceivedEventHandler(startProductProcess_OutputDataReceived);
startProductProcess.Start();
startProductProcess.BeginOutputReadLine();
}
输出事件如下所示,此事件需要确定线程的名称,以便它知道如何处理输出。
private void startProductProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
//Find thread name and perform event based on thread name
}
感谢您提供的任何帮助。
由于 IO 回调是在属于 CLR 线程池而不是属于您的线程的线程上调用的,因此它们没有名称。因此,实际上,您希望将线程名称与进程相关联。
远非优雅,但好吧,我想它有效:
在类的属性中添加Dictionnary<Process, string> _processTags;
然后将startProducts
更改为:
private void startProducts(string startScript)
{
//Thread productThread = new Thread();
Process startProductProcess = new Process();
// Save tag
_processTags.Add(startProductProcess, Thread.CurrentThread.Name);
startProductProcess.StartInfo.FileName = startScript;
startProductProcess.StartInfo.UseShellExecute = false;
startProductProcess.StartInfo.RedirectStandardOutput = true;
StringBuilder processOutput = new StringBuilder("");
startProductProcess.OutputDataReceived += new DataReceivedEventHandler(startProductProcess_OutputDataReceived);
startProductProcess.Start();
startProductProcess.BeginOutputReadLine();
}
startProductProcess_OutputDataReceived
:
private void startProductProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
string threadName = _processTags[sender as Process];
// stuff...
}