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安装等无法复制,那么一定是出了问题。既然应用程序一直在运行,为什么不在调试器中暂停执行,并查看每个线程中的“下一条语句”指针在哪里。如果出现某种僵局,这将帮助您找到它。