我正在尝试创建一个跨平台的.NET库(这里用于Unity),我需要一个静态函数。
因此,作为示例,主函数将如下使用:MyLib.AddCallback(Action callback)
。
然后我使用静态System.Timers.Timer
和AutoReset = true
来定期运行该回调。 (这只是一个例子)
有问题。如果我在Unity中测试我的库,将回调绑定到Debug.Log
并点击Play,计时器按预期启动,因此记录消息,但在离开播放模式时不会停止,导致内存泄漏(有时记录{{1 }})。
我看到这是有道理的,因为Unity的一般过程仍在运行。然而,显然,我不希望这样。我想停止运行回调并在应用程序停止时正确处理我的OutOfMemoryException
。而且我不知道该怎么做。
我尝试创建一个单例,将我的Timer
作为实例属性并在我的单例类中实现Timer
接口。这并没有解决我的问题,因为单身人士从未被处理过。
最后一件事。我不能依靠IDisposable
来调用我的Dispose或我的Update方法(而不是计时器),因为我不是专门针对Unity。
任何人都知道我应该如何管理它?
非常感谢
刚刚找到this thread来描述我的问题。仍未解决......
答案 0 :(得分:2)
看起来Timer正在另一个Thread中运行。
您可以在停止编辑器时调用的OnDisable
函数中停止并处理计时器。
public class TimerTest: MonoBehaviour
{
Timer timer = new Timer();
void OnDisable()
{
timer.Stop();
timer.Dispose();
}
}
通常,您应该在Unity中使用协程执行此操作。
1秒计时器的示例:
void Start()
{
StartCoroutine(startTimer(1));
}
IEnumerator startTimer(float time)
{
while (true)
{
//Wait for x seconds
yield return new WaitForSeconds(time);
//Invoke function
doSomthing();
}
}
void doSomthing()
{
}
如果您需要查看计时器中的微秒或计时器值太小,请使用Time.deltaTime
。
答案 1 :(得分:0)
在你改述问题之后,这是我的两分钱。
不确定是否可以完全避免在Unity的生命周期中添加内容。
解决方案可能是您在库中创建了一个“OnExit()”函数,然后可以根据您使用的框架调用不同的位置。
在Unity中,您可以在OnDisable()生命周期方法中调用它。
在另一个框架中,您可以将它放在您知道将在应用程序退出时调用的其他位置。
有关Unity中存在哪些生命周期方法的参考,请查看以下链接。
https://docs.unity3d.com/Manual/ExecutionOrder.html
如果您告诉我们您在哪里考虑使用您的图书馆,那么可以帮助人们更多地阐述可能性。