【问题标题】:Xamarin.mac WKWebView leaves 2 orphaned processesXamarin.mac WKWebView 留下 2 个孤立进程
【发布时间】:2019-12-31 22:06:51
【问题描述】:

我的应用程序是一个基于文档的 Xamarin.mac 应用程序,它使用 WKWebView 显示在代码中生成的 HTML 内容。每次创建新窗口时,也会创建 2 个新进程:“APP_NAME Networking”和“about:”。但是,当窗口关闭时,这两个进程仍然存在。打开 10 个窗口,关闭 10 个窗口,我有 20 个孤立进程。

有没有人知道如何在关闭窗口时让这些消失?

(编辑) 请注意,这些不是孤立的对象/数据结构,而是独立运行的系统进程,属于应用程序,但不属于生成它们的文档窗口/视图控制器。退出应用程序,子进程死亡。但是关闭窗口,子进程继续存在......

【问题讨论】:

  • 你可以维护一个原生的 ref。确保释放所有返回 IDisposable 的本机对象。使用 Xamarin Profiler 将有助于追踪这些对象。
  • @SushiHangover 我认为所有本机对象在 Xamarin 中都是 IDisposable。
  • 我构建了一个测试应用程序,它只是一个基于文档的新应用程序、文档空间中的 WKWebView 和一个名为“webView”的出口。构建并运行,每次打开窗口时都会在 Activity Monitor 中生成额外的进程,但永远不会消失。
  • 这里是项目的链接:[dropbox.com/s/nk0t6oznklvf6u2/…App Source)
  • @IvanIčin 是吗?....

标签: xamarin wkwebview xamarin.mac


【解决方案1】:

.NET 中的内存管理基于垃圾收集。因此,从应用程序或开发人员的角度来看,它是不确定的。这意味着上面的事情在 .NET 中并不意外。

在 Xamarin 中还有一个额外的问题 - Xamarin 保持对本机资源的引用,但它不知道这些资源是什么以及它们占用了多少计算机资源,因此自动垃圾收集通常不会在您期望的时候发生。

建议你应该Dispose你不需要的重要原生资源。我肯定会在这些资源中考虑 WKWebView。

除此之外,您还可以手动启动垃圾回收,但除非确实需要,否则不建议这样做。

【讨论】:

  • 在 Xcode 中创建 outlet 时,Dispose 会自动添加到 ViewController.designer.cs 文件中。我将 GC.Collect() 添加到 ViewDidDisappear 方法和析构函数方法中。没有影响。请注意,这些本身不是孤立的对象或内存......甚至不是线程。这些是被孤立的实际系统进程。
  • @DesignDB Dispose 不会自动添加,因为它永远不会被执行。据我所知,它不被称为 Dispose,而是类似于发布设计师的出口。但无论哪种情况,除非你这样做,否则它永远不会被调用。
  • 知道了。它是自动构建的,但我从未想过它也不会被自动调用。无论是在 ViewWillDisappear、ViewDidDisappear 还是类析构函数中调用它,调用该函数似乎不会杀死子进程。有没有一个“完美”的地方可以称呼它?
  • @DesignDB 我现在无法检查更多内容,但如果你说的是真的(进程没有被杀死),你最好的办法是构建一个 XCode 项目,看看是否出现问题。如果它没有将它作为一个错误提交给 Xamarin,如果它也出现在 XCode 中,那么它可能是 Apple 的错误,或者它可能是你不应该关心的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 2017-01-18
  • 2013-08-04
  • 2015-06-30
  • 2020-07-15
  • 1970-01-01
相关资源
最近更新 更多