Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 奇怪的进程。GetProcesss问题_C#_.net - Fatal编程技术网

C# 奇怪的进程。GetProcesss问题

C# 奇怪的进程。GetProcesss问题,c#,.net,C#,.net,这段代码的行为很奇怪。如果我评论这句话 Process[] processlist = Process.GetProcesses(); 然后它就如预期的那样工作了。我每2秒看到一条“测试”消息。如果我离开此行,它将打印2-3条“测试”消息,然后停止。我做错了什么 static void processTimerCallback(object x) { try { Process[] processlist = Pr

这段代码的行为很奇怪。如果我评论这句话

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

我试过一次作为控制台应用程序和一次作为windows窗体应用程序。它没有在我的机器上崩溃,但我以管理员身份登录。也许您访问了一个不允许访问的进程


代码有点奇怪,因为您在windows应用程序中访问控制台。我错过了Main方法之前的属性STAThread(但是我尝试了不使用,它没有崩溃)。

我链接到了另一个解释问题的答案。简而言之,问题不在于进程类,而在于计时器。它是Main()方法的局部变量,不足以使垃圾收集器确信计时器对象仍在使用。没有人可以从您的代码片段中重新处理该问题,因为垃圾收集器的运行频率不够

调试版本和发布版本之间的区别在于jitter报告局部变量生命周期的方式。附加调试器时,它会报告整个方法体的生存期。这使得调试变得容易

此问题的两个基本修复方法。洞察一:

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

检查是否存在异常,可能是由于某些错误导致了此行为。仅给出此代码,我无法重现此行为。是否正在引发异常?MainForm做什么?是的,这会发生在例外情况下。我想把Console.WriteLine(“cunch”)放在catch块中,您就会知道。即使出现异常,Console.WriteLine仍然会发生。并没有发现异常。我替换了应用程序。使用Thread.Sleep(50000)运行,所以现在并没有提到MainForm。我创建了一个新的控制台项目,但我无法复制它。所以我转换成了一个Windows项目。还是没有发生。但后来我切换到了释放模式。在释放模式下,此崩溃。用Trace替换控制台并添加STAThread没有帮助。我也测试了发布模式。没有撞车。我仍然认为这可能是一些安全问题。你能试试另一台机器吗?事件日志中有任何条目吗?日志中没有关于此的条目。相同的代码在调试模式下工作,因此由于安全原因,不能使用。我已经创建了一个新的Windows应用程序,并粘贴了该代码,但仍然存在。也不例外,;应用程序一直在运行,只是发生了一些事情,Console.WriteLine永远不会被调用。我已经在.NET4和3.5上对此进行了测试。如果您说我的机器、.NET安装等无法复制,那么一定是出了问题。既然应用程序一直在运行,为什么不在调试器中暂停执行,并查看每个线程中的“下一条语句”指针在哪里。如果出现某种僵局,这将帮助您找到它。