【问题标题】:How to dispose of processes after creating them?创建进程后如何处理它们?
【发布时间】:2014-12-09 19:21:47
【问题描述】:

对问题“How to open a URL in chrome incognito mode”引用an answer

我写了这个并且成功了:

Process.Start(@"chrome.exe", "--incognito http://domain.com");

有人回复this comment:

您需要处置该对象,否则您会发生内存泄漏。

我通常使用Process.Start 创建许多进程,但我从不“处理”它们。这是什么,我该怎么做?

【问题讨论】:

  • 尝试 .Close() 关闭应用程序。
  • 相关:stackoverflow.com/questions/185314/…。您的问题在那里得到解答。
  • @Mohamadshiralizadeh .Close() 确实关闭应用程序 - 它只是释放与其关联的资源。
  • 你的权利@Michael...

标签: c# process idisposable process.start


【解决方案1】:

根据MSDN 上的组件文章,这是正确的。您应该在使用后处置您的 Process 对象,释放所有非托管资源(应用程序不会关闭)。

组件应通过调用其 Dispose 方法显式释放资源,而无需通过隐式调用 Finalize 方法等待自动内存管理。当一个 Container 被释放时,该 Container 内的所有组件也会被释放。

还有来自Processarticle

此类型实现 IDisposable 接口。当您使用完该类型后,您应该直接或间接地处理它。要直接释放该类型,请在 try/catch 块中调用其 Dispose 方法。要间接处理它,请使用语言构造,例如 using(在 C# 中)或 Using(在 Visual Basic 中)。有关详细信息,请参阅 IDisposable 接口主题中的“使用实现 IDisposable 的对象”部分。

Process 派生自 Component,因此您应该将其丢弃。很简单:

Process myProc = Process.Start(@"chrome.exe", "--incognito http://domain.com");
myProc.Dispose();

甚至更简单

using (Process myProc = Process.Start(@"chrome.exe", "--incognito http://domain.com"))
{
   //Do whatever with the process
}

using 块将在块退出时释放对象。

【讨论】:

  • 当你说退出块时处置对象。 dispose这个词,这是否意味着进程将要终止?所以如果我加载 chrome + 一个网站,然后处理它,chrome 现在关闭了吗?
  • @ModS 不,您只是将非托管句柄释放到进程中。应用程序将正常运行。
  • @RandomUser 我不确定您指的是什么信息。 Close 上的文章说 Dispose 调用它。它们仍然是不同的方法调用。我会总是Dispose路线,因为它可以做的不仅仅是打电话给Close
【解决方案2】:

使用Process.Close();

var Pro = new Process();
Pro.Start(@"chrome.exe", "--incognito http://domain.com");
Pro.WaitForExit(); //optional
Pro.Close();

【讨论】:

  • 在此处谨慎使用WaitForExit;线程将阻塞,直到应用程序退出或在另一个线程上调用 Close/Dispose
  • 如果我有一个方法一遍又一遍地执行此操作,(例如,每次我单击 chrome 时它都会创建 chrome 的进程)全局声明 Pro 以避免使用 new 关键字是否安全?而是一遍又一遍地重新分配它,而不是一遍又一遍地创建它?
  • @ModS 这将保证泄漏,直到 GC 到来并最终确定孤立引用。您应该在重新分配之前致电Dispose(或Close
  • 理论上:全局声明Process Proc。使用将开始信息分配给 Proc。处理过程根据需要重复使用?由于我正在处理所有用途,这还会有泄漏吗?
  • @ModS 那个版本就好了。更简单的是使用 using 块(变量创建很便宜!)但是你所拥有的会工作。
猜你喜欢
  • 2021-12-13
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2016-03-09
  • 2011-04-06
  • 2021-06-27
相关资源
最近更新 更多