2009-11-08 46 views
0

我希望將某些數據傳遞給Process對象的委託方法,當它觸發Exited事件---我不知道如何。我該如何使用C#'new Process'對象來做到這一點


我有一些代碼(在Windows服務),它會需要一段時間..所以我分叉掀起了新的進程來做到這一點..像......

string recipientEmail = "[email protected]"; 

var commandProcess = new Process 
{ 
    StartInfo = 
     { 
      FileName = commandLine, 
      Arguments = commandArgs 
     } 
}; 
commandProcess.Start(); 

現在,當這完成時,我想做一些其他的東西。例如,發送電子郵件。現在

,這不是太硬的時候,我們可以: -

commandProcess.EnableRaisingEvents = true; 

// Method to handle when the process has exited. 
commandProcess.Exited += CommandProcess_Exited; 

現在,我不知道我是如何傳遞變量recipientEmail的方法CommandProcess_ExitedExited事件。

例如方法將CommandProcess_Exited方法撥打電話: -

private static void SendEmailToRecipient(string recipientEmail) 
{ 
    .... 
} 

這可能嗎?

回答

4

您可以將變量設置爲非本地變量,即在類中聲明變量,以便它對事件處理方法可見。

或者你可以使用委託和寫入方法內嵌,它允許您訪問本地變量:

commandProcess.Exited += delegate 
    { 
     SendEmailToRecipient(recipientEmail); 
    }; 
+0

嗨約翰尼斯 - 請你詳細說明第二種方法。我想到了第一種方法..但這是一個Windows服務..這個類實際上是靜態的,而不是實例....(我沒有提到).. oops:P – 2009-11-08 23:54:01

+0

@ Johannes - 我已經更新了用我想要調用的示例Email方法進行初始發佈。 – 2009-11-08 23:56:28

+0

我刪除了我的答案,因爲這個特定的情況似乎有點矯枉過正,這是一個更簡單的解決方案。 – James 2009-11-09 00:10:16

1

這樣的事情我傾向於做的是延長EventArgs類和創建我自己的版本其中包括所需數據:

public class MyProgramEventArgs : EventArgs 
{ 
    public MyProgramEventArgs() 
    { 
    } 

    public string RecipientEmail { get; set; } 
} 

那麼你可以做的是捕獲從程序本身的Exited,做對ARGS一些預處理,然後調用方法:

public static void Main(string[] args) 
{ 
    commandProcess.EnableRaisingEvents = true; 
    ... 
    commandProcess.Exited += OnProgramExited; 
} 

public void OnProgramExited(object sender, EventArgs e) 
{ 
    MyProgramEventArgs args = new MyProgramEventArgs(); 
    args.RecipientEmail = "[email protected]"; 
    CommandProcess_Exited(sender, args); 
} 

public void CommandProcess_Exited(object sender, MyProgramEventArgs e) 
{ 
    SendEmailToRecipient(e.RecipientEmail); 
} 
+0

+1給你,然後:-)。 – Joey 2009-11-09 11:32:33

相關問題