奇怪的过程.GetProcesses问题
本文关键字:GetProcesses 问题 过程 | 更新日期: 2023-09-27 18:09:30
这段代码的行为很奇怪。如果我注释
行 Process[] processlist = Process.GetProcesses();
则按预期工作。我每两秒钟看到一条"测试"信息。如果我离开这一行,它将打印2-3个"test"消息,然后停止。我做错了什么?
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());
}
我链接到另一个解释这个问题的答案。简而言之,问题不在于Process类,而在于计时器。它是Main()方法的一个局部变量,不足以让垃圾收集器确信计时器对象仍在使用中。没有人能从你的代码片段中重现这个问题,因为垃圾收集器不会经常运行。
调试版和发布版的区别在于抖动报告局部变量生命周期的方式。当附加调试器时,它会报告整个方法体的生命周期。这使得调试变得容易。
这个问题的两个基本修复。
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());
}
我试过一次作为控制台应用程序,一次作为windows窗体应用程序。它没有崩溃在我的机器上,但我是作为管理员登录的。也许你访问了一个你不允许访问的进程?
代码有点奇怪,因为您是在windows应用程序中访问控制台的。在Main方法之前,我错过了属性STAThread(但是我没有尝试过,它没有崩溃)。