2010-10-22 39 views
2

我正在使用System.Diagnostics.Process類來執行命令行程序。C# - 重寫事件處理程序 - 添加參數

我正在使用OutputDataReceived方法將輸出重定向到我自己的方法。

pr.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived); 
pr.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceived); 

但是,我有多個線程運行此cmd程序的多個實例。我想要做的是能夠確定輸出數據來自哪個流程實例 - 理想情況下,包含名稱的字符串。 (每個進程在GUI上都有它自己的進度條,我創建了另一個事件將輸出傳遞給GUI,因此,我需要知道數據來自哪個進程以更新進度條)。

我開始進行實驗:

public override delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e, string processName); 

然後我發現我不得不重寫Process類內的方法OutputDataReceived。這反過來意味着我必須創建一個繼承System.Diagnostics.Process的自定義類,並且有一個接受字符串參數的方法,因此OutputDataReceived事件可以將流程實例名稱(字符串)傳遞給我的覆蓋的DataReceivedEventHandler

問題的目的是獲得一些關於如何進行的意見。我提出的建議似乎是正確的方式來實現我想要的嗎?或者,有沒有更好的方法來做到這一點?

+0

只需創建一個小幫手類。它可以將Process實例以及您需要的任何其他狀態存儲爲專用字段。 – 2010-10-22 07:36:22

回答

5

您不能僅僅使用傳回的sender對象並檢查它正在運行哪個進程?

+0

發件人對象中沒有信息來識別它是哪個進程。 – nf313743 2010-10-22 07:20:56

+0

查看過程屬性。我可以使用Process.StartInfo.Domain屬性設置進程名稱。由於Domain不應該像這樣被使用,所以可能不是很好的編程實踐,但它應該可以工作。 – nf313743 2010-10-22 07:39:58

2

您可以強制轉換(在你的代碼片段pr)發送參數Process對象

5
從使用 sender現有答案

除此之外,您還可以使用lambda表達式(或匿名方法),使這個簡單:

pr.OutputDataReceived += (sender, args) => HandleData(pr, args); 

其中HandleData將有一個簽名

void HandleData(Process process, DataReceivedEventArgs e) 

匿名函數是一種非常方便的方式,它將事件訂閱時在本地已知的信息傳播到需要處理該事件的代碼。