奇怪的过程.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());
}

奇怪的过程.GetProcesses问题

我链接到另一个解释这个问题的答案。简而言之,问题不在于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(但是我没有尝试过,它没有崩溃)。