System.Threading.Timer冻结计算机

时间:2017-03-27 23:44:25

标签: c# performance crash

我正在创建一个游戏,我有一个大约100毫秒的寻路功能。我有5个敌人,每个都在contstructor中有这个功能:

newPath = new System.Threading.Timer((e) => {
  getNewPath(); //The function that takes ~100 ms
}, null, 0, 5000);

现在,我在程序的早期阶段使用System.Threading.Timer(每50毫秒运行一次仅用于步进功能,更新位置等)。那一个工作正常,但如果我运行这个功能(不要忘记我有5个敌人,所以它每5秒运行5次),我的整个计算机只是冻结。现在我没有一台糟糕的计算机(它不是最好的,但它对我正在使用它有很多好处),所以我不知道问题是什么。即使所有计时器一个接一个地运行(它们不应该运行,它们应该同时运行),它应该花费的最多时间是500毫秒(或半秒),但它完全杀死我的计算机,到了这一点我的鼠标不移动,我不能按Ctrl-Alt-Del,我只需按住电源按钮直到它关闭。

我测试了一个简单的打印函数来代替getNewPath(),它完美无缺地按预期工作,所以我真的不知道是什么问题。

我的问题是:

  1. 导致我的电脑锁定到必须按住电源按钮的原因。
  2. 除了System.Threading.Timer之外,还有什么我可以使用的东西能够在不完全杀死我的电脑的情况下获得理想的结果吗? (能够同时运行此功能约20次,因为它是一个MMO,并且可能有数百个敌人需要进行寻路更新)。
  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

在不知道getNewPath()内部的代码的情况下,甚至无法猜出原因。而且很难相信只有一个简单的A *路径寻找算法

以下是开始调查的一些要点

  1. 停止前的CPU使用率是多少?它发生时的速率是多少?哪个流程的费率最高?
  2. 什么是磁盘,网络,内存使用率?
  3. 除此之外,getNewPath还会消耗其他资源吗?
  4. 您可以打印5条信息。但它们是在getNewPath
  5. 之前/之内/之后打印的
  6. 你有getNewPath的源代码吗?你能修改getNewPath中的代码吗?
  7. getNewPath线程安全吗?它会创建更多线程吗?
  8. 可能还有更多值得关注的事情。但这些应该足以让你开始。任何人都有必要给出意义建议。