我正在編寫自定義調度程序,因此我想在當前時間啓動任何要註冊的任務,而不會花費太多時間,以免調度程序在下一次出錯插槽。因此,我創建了一個睡眠線程,直到下一個預定事件,然後喚醒並運行下一個或多個事件,然後再次睡眠。任務在後臺作爲進程運行,所以我可以將它們設置並儘快將其關閉。爲了便於控制進程的日誌記錄,我保留了一個內部的任務隊列,在喚醒時,我會消耗掉進程中的消息,但是我還想擁有一個EventHandler,然後可以通過註冊多長時間完成該任務的日誌記錄它花了,它是否失敗或成功,一旦它退出。在EventArgs或EventHandler的發件人上捎帶數據
因爲我使用Process.Process()類在後臺執行任務,所以沒有辦法(我可以看到)將我的唯一任務引用傳遞給處理程序,以便我可以正確完成日誌記錄。我正在設置我的處理程序,如下面的代碼。
pTask = new Process();
pTask.Exited += new EventHandler(pTask_Exited);
我故意使用的術語搭載在我的標題,因爲在我的研究我碰到一個similar question吸引一個答案是說,如果你需要捎帶上EventArgs的數據出來,你的設計是有缺陷的。我可以接受我的設計可能有缺陷,但一直未能找到啓發,我應該如何以不同的方式更有效地設計它。任何指導表示讚賞。
這看起來很有希望,但我不完全理解。直到你發佈這篇文章,我才知道lambdas,所以我的快速閱讀至少有一定道理。我會做類似於(在psuedo代碼中)pTask.Exited + =(this,Something)=> ExitHandler(taskInfo){Console.Writeline(s.ExitCode + taskInfo)}。什麼東西會代替EventArgs? – pogpogoSE
@pogpogoSE我的例子,定義了一個lambda(本質上是一個函數),它帶有2個參數,'s'和'e',當被調用時調用'ExitHandler'。因爲我們將這個lambda附加到Exited事件中,所以編譯器推斷's'和'e'的類型,所以我們不必像定義一個普通函數時那樣明確地聲明它們。我們實際上並沒有使用任何一個參數,但他們需要在那裏才能匹配可附加到事件的方法所需的簽名。我編輯了我的答案,以顯示如何從處理程序中訪問進程的退出代碼。 – Iridium
感謝您的進一步澄清,我會嘗試這個併發布我找到的。 – pogpogoSE