2012-04-20 71 views
1

我目前的工作在其上使用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 
    } 

感謝您提供任何幫助。

+1

'startProductProcess_OutputDataReceived'將被調用從CLR ThreadPool的Thread中,不是你的,所以它們不會有「名稱」。然而,'sender'是你正在做IO的'Process' - 也許你可以用它來回到你的產品名稱。 – 2012-04-20 10:08:39

+0

發佈的代碼還在主線程上運行'startProducts()',打字錯誤? – 2012-04-20 10:12:09

+0

@亨克霍爾特曼是的,抱歉,這是一個錯字 – Boardy 2012-04-20 10:28:17

回答

2

由於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... 
} 
+0

由於這是工作,只是一個側面沒有質疑,即使它已經開始新的線程,你的答案的偉大工程,當我在VS2010查看線程窗口,它說沒有任何 – Boardy 2012-04-20 10:27:53

+0

因爲你的線程立即完成(請參閱您的主線程功能)。他們只註冊IO回調,然後他們離開。 – 2012-04-20 10:30:01

+0

哦,我認爲線程會繼續運行,而System.Diagnostic.Process正在運行 – Boardy 2012-04-20 10:34:46

相關問題