System.Threading.Timer冻结计算机 - c#

我正在创建游戏,并且具有寻路功能,该功能大约需要100毫秒。我有5个敌人,每个都在构造函数中具有此功能:

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()的方法,它可以完美运行且符合预期,因此我真的不知道问题出在哪里。

我的问题是:

是什么导致我的计算机锁定到必须按住电源按钮的程度。
除了System.Threading.Timer之外,还有什么我可以使用的东西,可以在不完全破坏我的计算机的情况下提供期望的结果吗? (由于它是MMO,并且能够一次运行多达20次此功能,因此它可能需要成百上千个敌人来进行寻路更新)。

谢谢!

参考方案

如果不知道getNewPath()中的代码,就不可能猜出原因。很难相信这只是一个简单的A *路径查找算法

这是开始调查的一些要点

停止之前的CPU使用率是多少?发生率是多少?哪个过程的发生率最高?
磁盘,网络,内存使用率是多少?
除了上述内容,getNewPath是否还会消耗其他资源?
您可以打印5条消息。但是它们在getNewPath之前/内部/之后打印吗
您有getNewPath的源代码吗?您可以在getNewPath中修改代码吗?
getNewPath线程安全吗?它会创建更多线程吗?

可能还有更多要看的东西。但是这些应该足以让您入门。它们是任何人提供有意义建议的必要条件。

C#无法将类型为“ System.Double”的对象转换为类型为“ System.Single” - c#

在判断此问题已得到回答之前,请阅读说明。我在下面有这个简单的代码:Dictionary<string, object> d = new Dictionary<string, object>(); d.Add("key" , 30d); System.Diagnostics.Debug.WriteLine($…

错误:无法将类型为“ System.Int32”的对象转换为类型为“ System.String”的对象 - c#

我已经完成了完美的编码注册页面,登录代码,现在UpdateCustomer页面有错误-背景信息:我正在使用Microsoft Access作为数据源 LabelState.Text = (string)Session["sState"]; LabelPostalCode.Text = (string)Session["sPost…

System.timer不会引发事件,并且控制台会立即终止 - c#

我需要一个每分钟执行一次的计时器,但是我很难让计时器完全用我以前使用的代码运行。所以我想我在做一些根本上与代码无关的错误,但是即使在Visual Studio Community 2017中刚刚创建的Console项目中,它也不会执行_timer_elapsed方法。控制台立即终止,没有错误,就好像它已经执行了所有代码using System; using …

System.out.println-此方法是否在Java中链接? - java

我想知道下面的Java代码:“ System.out.println”。我对此是正确的:“系统”是静态类。 “ .out”是“系统”类的方法。这是我对“ .println”有点困惑的地方-这是一个什么类/对象的方法?另外,这个概念被称为“方法链接”吗?谢谢GF 参考方案 不,这不是方法链接。您正确地认为System是一个类(只是一个常规类,不是“静态”,只有…

System.out.printf不打印整数参数 - java

我是Java编程的新手,无法从另一个类返回方法。这两个类都可以编译并成功运行。我可以从一个类中调用一个简单的int,但是当我想计算用户输入的两个输入整数时,我只会得到一个空格。这是我的计算课class calculations { public final int AGE = 53; public int numbers(int num1, int num2…