我想启动一个进程而不是等待它完成。但是,当进程退出时,我想调用另一个进程并将参数传递给它。
我可以用这样的已知函数来做到这一点:…
使用方法委托的变体,以防委托在处理时需要返回一些内容 completion 串。 我添加了 EventArgs 参数,因为它在你的问题中,但我不知道这是如何有用的。你可以在这里忽略它。
completion
EventArgs
你也可以在没有的情况下这样做 的 delegate 强> 声明并通过:
delegate
Func<object, EventArgs, string, string> completionFunc
而不是 CompletionFunc completionFunc 中的参数 RunCommand 方法。
CompletionFunc completionFunc
RunCommand
public delegate string CompletionFunc(object o, EventArgs e, string s); public static void RunCommand(string path, string parms, string completion, CompletionFunc completionFunc) { string result = string.Empty; Process myProc = new Process(); myProc.StartInfo.FileName = path; myProc.StartInfo.Arguments = parms; myProc.EnableRaisingEvents = true; myProc.StartInfo.UseShellExecute = false; myProc.Exited += (obj, evt) => { result = completionFunc(obj, evt, completion); Console.WriteLine($"{result} ExitCode: {myProc.ExitCode})"); if (myProc != null) myProc.Dispose(); }; myProc.Start(); }
打电话给 RunCommand 方法。 作为测试,我正在使用 tracert.exe 跟踪IP地址(需要一段时间才能完成)。 该 RunCommand 方法是异步执行的,并将在打印到控制台时显示结果 Exited 事件被提出。
tracert.exe
Exited
该 str 参数,这里,将是 completion 字符串值时 RunCommand 方法执行。
str
这允许三种不同的方法调用:
的 在内衬 强> :
string completion = "[Some Data]"; RunCommand("tracert.exe", "[Some IP Address]", completion, (obj, evt, str) => { return $"Completion: {str + " : Completed"} " + $"Process: {((Process)obj).StartInfo.FileName} " + $"Result: {"Some result"}"; });
的 使用本地功能 强> :
private void SomeStartingMethod() { string MethodCall(object obj, EventArgs evt, string str) { return $"Completion: {str + " : Completed"} " + $"Process: {((Process)obj).StartInfo.FileName} " + $"Result: {"Some result"}"; } string completion = "[Some Data]"; RunCommand("tracert.exe", "[Some IP Address]", completion, MethodCall); }
的 使用与委托签名匹配的方法 强> :
string MethodCall2(object obj, EventArgs evt, string str) { return $"Completion: {str + " : Completed"} " + $"Process: {((Process)obj).StartInfo.FileName} " + $"Result: {"Some result"}"; } // Somewhere else string completion = "[Some Data]"; RunCommand("tracert.exe", "[Some IP Address]", completion, MethodCall2);
这些都将打印:
Completion: [Some Data] : Completed Process: tracert.exe Result: Some result ExitCode: 0)
您可以添加其他内容 Action 方法的参数 - Action是一个表示没有返回类型的方法的变量。因此,如果您将声明更改为:
Action
public static void RunCommand(string path, string parms, string completion, Action<object, EventArgs, string> exitedCallback) { Process myProc = new Process(); myProc.StartInfo.FileName = path; myProc.StartInfo.Arguments = parms; myProc.EnableRaisingEvents = true; myProc.StartInfo.UseShellExecute = false; myProc.Exited += (o, e) => exitedCallback(o, e, completion); myProc.Start(); }
所以现在,即使在运行时,您也可以传递与签名匹配的任何方法:
RunCommand("1.exe", string.Empty, string.Empty, CommandExecuted); RunCommand("1.exe", string.Empty, string.Empty, (o, e, c) => Console.WriteLine("Foo"));