gpt4 book ai didi

c# - 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

转载 作者:行者123 更新时间:2023-12-01 19:49:33 26 4
gpt4 key购买 nike

我有以下以 robocopy 开头的代码作为一个进程。我还需要进行数据库查询,以确定每次调用 robocopy 时需要复制哪些目录,因此我使用 ProcessStartInfo 来控制传递的参数。

internal class Program
{
private static void Main(string[] args)
{
using (var context = new MyDbContext())
{
IEnumerable<ProcessStartInfo> processInfos = GetProcessInfos(context, args[0]);
foreach (ProcessStartInfo processInfo in processInfos)
{
// How can I reuse robocopy Process instances and
// how can I dispose of them properly?
Process.Start(processInfo);
}
}
}

private static IEnumerable<ProcessStartInfo> GetProcessInfos(MyDbContext context,
string directory)
{
const string defaultRobocopyFormatString = "{0} {1} /mir /tee /fft /r:3 /w:10 /xd *Temp*";
var directoryInfo = new DirectoryInfo(directory);
return from dir in directoryInfo.GetDirectories()
from myEntity in context.MyEntities
where dir.Name == myEntity.Name
select new ProcessStartInfo("robocopy",
string.Format(defaultRobocopyFormatString,
Path.Combine("C:\Test", dir.Name),
Path.Combine("C:\Test_bak", dir.Name)));
}
}

如何重用 foreach 内的 static Process.Start(ProcessStartInfo) 返回的 Process 实例循环以及如何正确处置它们?

最佳答案

您不能重复使用 Process 对象。 Process 类的行为与包装操作系统对象的所有其他 .NET 类类似。像Socket、Bitmap、Mutex、FileStream等等。它们是很小的 cookies ,烘烤起来非常便宜,并且在 GC 堆上占用的空间很小。他们仔细跟踪底层操作系统对象的生命周期,一旦对象死亡,.NET 包装器对象也不再有用。

Process 类通过其 Exited 事件和 HasExited 属性发出 cookie 已被吃掉的信号。它有一些有用的咬后属性,ExitCode 和 ExitTime。

但这就是结束,如果你想创建另一个进程,那么你必须烘烤另一个 cookie。使用 new 关键字或 Start() 工厂函数即可轻松完成。不要尝试优化它,没有意义,也不起作用。重用 ProcessStartInfo 就可以了,它不是包装类。

关于c# - 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30295096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com