2013-01-24 16 views
0

我正在編寫自定義調度程序,因此我想在當前時間啓動任何要註冊的任務,而不會花費太多時間,以免調度程序在下一次出錯插槽。因此,我創建了一個睡眠線程,直到下一個預定事件,然後喚醒並運行下一個或多個事件,然後再次睡眠。任務在後臺作爲進程運行,所以我可以將它們設置並儘快將其關閉。爲了便於控制進程的日誌記錄,我保留了一個內部的任務隊列,在喚醒時,我會消耗掉進程中的消息,但是我還想擁有一個EventHandler,然後可以通過註冊多長時間完成該任務的日誌記錄它花了,它是否失敗或成功,一旦它退出。在EventArgs或EventHandler的發件人上捎帶數據

因爲我使用Process.Process()類在後臺執行任務,所以沒有辦法(我可以看到)將我的唯一任務引用傳遞給處理程序,以便我可以正確完成日誌記錄。我正在設置我的處理程序,如下面的代碼。

pTask = new Process(); 
pTask.Exited += new EventHandler(pTask_Exited); 

我故意使用的術語搭載在我的標題,因爲在我的研究我碰到一個similar question吸引一個答案是說,如果你需要捎帶上EventArgs的數據出來,你的設計是有缺陷的。我可以接受我的設計可能有缺陷,但一直未能找到啓發,我應該如何以不同的方式更有效地設計它。任何指導表示讚賞。

回答

1

可以按如下方式實現這一目標使用lambda表達式:

首先定義將要運行的進程退出時的方法。這將是取代目前正在使用的所有事件處理程序,並執行必要的記錄等等:

void ExitHandler(Process process, YourTaskInfo taskInfo) // YourTaskInfo is some class that contains data about the task that needs to be passed to the handler 
{ 
    Console.WriteLine("Process for task: {0} exited with code: {1}", taskInfo, process.ExitCode); 
} 

然後,您可以將此方法附加到Exited事件處理程序如下:

pTask.Exited += (s,e) => ExitHandler(pTask, taskInfo); 

在通過這種方式,您可以將唯一的任務參考(taskInfo)傳遞給Exited處理程序,而無需擔心發件人或EventArgs上的任何「捎帶」等。

+0

這看起來很有希望,但我不完全理解。直到你發佈這篇文章,我才知道lambdas,所以我的快速閱讀至少有一定道理。我會做類似於(在psuedo代碼中)pTask.Exited + =(this,Something)=> ExitHandler(taskInfo){Console.Writeline(s.ExitCode + taskInfo)}。什麼東西會代替EventArgs? – pogpogoSE

+0

@pogpogoSE我的例子,定義了一個lambda(本質上是一個函數),它帶有2個參數,'s'和'e',當被調用時調用'ExitHandler'。因爲我們將這個lambda附加到Exited事件中,所以編譯器推斷's'和'e'的類型,所以我們不必像定義一個普通函數時那樣明確地聲明它們。我們實際上並沒有使用任何一個參數,但他們需要在那裏才能匹配可附加到事件的方法所需的簽名。我編輯了我的答案,以顯示如何從處理程序中訪問進程的退出代碼。 – Iridium

+0

感謝您的進一步澄清,我會嘗試這個併發布我找到的。 – pogpogoSE

0

Process本身,這是因爲sender通過獲取數據:

void pTask_Exited(object sender, EventArgs e) 
{ 
    Process p = (Process)sender; 
    TimeSpan duration = p.ExitTime - p.StartTime; 
    bool success = p.ExitCode == 0; 
} 
+0

我還需要一條信息,那是我的任務內部參考(人們可讀的名字加上日期時間(以分鐘爲單位),它計劃運行)。這是我唯一掙扎的一點。 – pogpogoSE

相關問題