这段代码表现得很奇怪。如果我评论该行
Process[] processlist = Process.GetProcesses();
然后按预期工作。我每2秒看一次“测试”消息。如果我离开这一行,它将打印2-3个'测试'消息然后停止。我做错了什么?
static void processTimerCallback(object x)
{
try
{
Process[] processlist = Process.GetProcesses();
}
catch
{
}
Console.WriteLine("test");
}
static void Main(string[] args)
{
System.Threading.Timer processTimer = new System.Threading.Timer(new TimerCallback(processTimerCallback), null, 2000, 2000);
Application.Run(form = new MainForm());
}
答案 0 :(得分:2)
我链接到解释问题的另一个答案。简而言之,问题不在于Process类,而在于计时器。它是Main()方法的局部变量,不足以让垃圾收集器确信计时器对象仍在使用中。没有人可以从你的代码片段中重新解决问题,因为垃圾收集器不会经常运行。
Debug和Release构建之间的区别在于抖动报告局部变量的生命周期的方式。附加调试器后,它会报告整个方法体的生命周期。这使调试变得容易。
针对此问题的两个基本修复。洞察力之一:
static void Main(string[] args)
{
System.Threading.Timer processTimer = new System.Threading.Timer(new TimerCallback(processTimerCallback), null, 2000, 2000);
Application.Run(form = new MainForm());
GC.KeepAlive(processTimer);
}
实用的那个:
static System.Threading.Timer processTimer;
static void Main(string[] args)
{
processTimer = new System.Threading.Timer(new TimerCallback(processTimerCallback), null, 2000, 2000);
Application.Run(form = new MainForm());
}
答案 1 :(得分:0)
我曾经尝试过一次作为控制台应用程序,一次作为Windows窗体应用程序。它没有在我的机器上崩溃,但我以管理员身份登录。也许你访问了一个你不被允许的过程?
代码有点奇怪,因为您在Windows应用程序中访问控制台。我在Main方法之前错过了STAThread属性(但是我试过没有,它没有崩溃)。