我目前的工作在其上使用System.Diagnostic.Process方法來配置文件中啓動了幾個腳本的C#項目。確定哪個線程觸發一個事件
我有一個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
}
感謝您提供任何幫助。
'startProductProcess_OutputDataReceived'將被調用從CLR ThreadPool的Thread中,不是你的,所以它們不會有「名稱」。然而,'sender'是你正在做IO的'Process' - 也許你可以用它來回到你的產品名稱。 – 2012-04-20 10:08:39
發佈的代碼還在主線程上運行'startProducts()',打字錯誤? – 2012-04-20 10:12:09
@亨克霍爾特曼是的,抱歉,這是一個錯字 – Boardy 2012-04-20 10:28:17