Strange Process.GetProcesses问题

时间:2011-09-21 16:51:44

标签: c# .net

这段代码表现得很奇怪。如果我评论该行

        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());
}

2 个答案:

答案 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属性(但是我试过没有,它没有崩溃)。