如何重用Process实例与略有不同的ProcessStartInfo实例?我有以下代码来启动robocopy作为进程。我还需要进行数据库查询以确定每次调用robocopy时需要复制哪些目录,因此我使用ProcessStartInfo来控制传递的参数。内部类程序{privatestaticvoidMain(string[]args){使用(varcontext=newMyDbContext()){IEnumerableprocessInfos=GetProcessInfos(context,args[0]);foreach(ProcessStartInfoprocessInfoinprocessInfos){//如何重用robocopyProcess实例和//如何正确处理它们?Process.Start(processInfo);}}}privatestaticIEnumerableGetProcessInfos(MyDbContextcontext,stringdirectory){conststringdefaultRobocopyFormatString="{0}{1}/mir/tee/fft/r:3/w:10/xd*Temp*";vardirectoryInfo=newDirectoryInfo(目录);从directoryInfo.GetDirectories()中的dir从context.MyEntities中的myEntity返回,其中dir.Name==myEntity.NameselectnewProcessStartInfo("robocopy",string.Format(defaultRobocopyFormatString,Path.Combine("C:Test",dir.名称),Path.Combine("C:Test_bak",dir.Name)));}}如何在foreach循环中重新使用staticProcess.Start(ProcessStartInfo)返回的Process实例,如何正确处理它?您无法重新使用Process对象Process类的行为类似于包装操作系统对象的所有其他.NET类。像Socket、Bitmap、Mutex、FileStream等。它们是微小的小cookie,它们非常便宜并且在GC堆上占用的空间非常小。他们仔细跟踪底层操作系统对象的生命周期,一旦对象死亡,.NET包装器对象就不再有用。Process类通过其Exited事件和HasExited属性向cookie发出信号。它有一些有用的捕捉属性,ExitCode和ExitTime。但这就是它结束的地方,如果你想创建另一个过程,那么你必须烘烤另一个cookie。使用new关键字或Start()工厂函数很简单。不要试图优化它,没有意义,它不会起作用。重用ProcessStartInfo很好,它不是包装类。您实际上不需要重用Process类——它只是底层流程的包装器。当这个过程结束时,它们就会消失——这就是首先要有一个过程的意义所在。相反,您似乎真的只是想确保一次只有一个robocopy进程在运行,这非常简单:共享所有内容,如果它对您有用并且您需要了解更多有关C#的学习教程,希望大家多多关注——using(varcontext=newMyDbContext()){IEnumerableprocessInfos=GetProcessInfos(context,args[0]);foreach(ProcessStartInfoprocessInfoinprocessInfos){using(varprocess=Process.Start(processInfo)){//阻塞直到进程结束process.WaitForExit();}//当`using`块离开时,调用`process.Dispose()`。}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
