【发布时间】:2017-09-20 09:36:34
【问题描述】:
我正在尝试创建一个需要静态函数的跨平台 .NET 库(此处用于 Unity)。
因此,作为示例,主函数将像这样使用:MyLib.AddCallback(Action callback)。
然后我使用静态System.Timers.Timer 和AutoReset = true 以定期运行该回调。 (这只是一个例子)
有问题。如果我在 Unity 中测试我的库,将回调绑定到 Debug.Log 并点击播放,计时器按预期启动,因此记录消息,但在离开播放模式时不会停止,导致内存泄漏(有时记录 OutOfMemoryException)。
我明白这有什么意义,因为 Unity 的一般进程仍在运行。但是,很明显,我不希望这样。我想在应用停止时停止运行回调并正确处理我的Timer。而且我不知道该怎么做。
我尝试创建一个单例,将我的Timer 作为实例属性并在我的单例类中实现IDisposable 接口。这并没有解决我的问题,因为从未处理过单例。
最后一件事。我不能仅仅因为我不是专门针对 Unity,而是依靠 GameObject 来调用我的 Dispose 或我的 Update 方法(而不是计时器)。
有人知道我应该如何管理吗?
非常感谢
编辑
刚刚发现this thread 准确描述了我的问题。还没解决……
【问题讨论】:
-
为什么不使用 InvokeRepeating() 运行回调;还是协程?当播放模式停止时,它应该会停止。
-
因为这意味着依赖一个游戏对象来调用我的回调。这意味着添加一个带有 DontDestroyOnLoad 的 GameObject,但我的库需要是跨平台的(不仅适用于 Unity),所以不能真正依赖它......
-
停止尝试将您的问题变成其他问题。如果您的问题与 Unity 无关,则不要标记 Unity。它清楚地说 “如果我在 Unity 中测试我的库,将回调绑定到 Debug.Log 并点击 Play,计时器按预期启动,因此记录消息,但在离开 Play 模式时不会停止,导致内存泄漏(有时记录 OutOfMemoryException)。” 这就是我回答的第一部分所要解决的问题。这个问题现在应该已经解决了。
-
我从一开始就说过我不能依赖游戏对象。我意识到我的问题并不清楚。我对其进行了编辑以避免进一步混淆。谢谢你的帮助
标签: c# unity3d memory-leaks timer singleton