0

Console.WriteLine() 不会向屏幕输出任何内容,而处理程序 SystemEvents_SessionSwitch() 在阻塞计算机中被调用。但是如果在 Main() 方法中至少调用一次方法 Console.WriteLine(),那么处理程序中的方法将起作用。这种奇怪行为/错误的原因是什么?

我使用的是 Windows 8 64 位,.NET Framework 4.0

using System;
using Microsoft.Win32;

namespace TestWindowsEvents
{
    class Program
    {
         static void Main(string[] args)
         {
             SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
             //Console.WriteLine("Test"); //if uncomment this line, then Console.WriteLine() in SystemEvents_SessionSwitch() will work
             Console.ReadKey();
         }

         static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
         {
             Console.WriteLine("SessionSwitch"); //this does not working 
             System.Diagnostics.Debug.WriteLine("SessionSwitchDebug"); //and this does not working too..
         }
    }
}

更新: 处理程序本身 SystemEvents_SessionSwitch () 被调用。我通过放置断点专门检查了这一点。并在锁定计算机断点后激活。但是 Console.WriteLine() 不会向控制台输出任何文本...

4

2 回答 2

3

我可以从问题描述中看出您使用的是 .NET 4.5。您的 Console.ReadKey() 方法采用锁定,4.5 中的新行为,它可以防止其他线程写入控制台并弄乱显示。

该锁会阻止您的事件处理程序写入控制台。它在另一个线程上运行,这是必要的,因为您正在使用不泵送消息循环的控制台模式程序。SystemEvents 类将创建自己的类以确保事件触发。对此,赞成的答案是错误的。

它尝试写入的内容最终会到达控制台,但这当然会在控制台窗口关闭前一毫秒发生,因此您永远看不到它。

这种新的 4.5 行为确实注定要测试某些东西的快速程序。您需要一种更好的方法来确定您的程序已完成,“按任意键继续”方法不再有效。一个不带锁的相当蹩脚的替代方案可能是:

        while (!Console.KeyAvailable) System.Threading.Thread.Sleep(100);

更新:此问题已在通过 Windows 更新提供的 .NET 4.5 更新中得到修复。不确定我何时收到更新,大约在 2013 年 8 月左右。

于 2013-06-11T21:13:42.243 回答
2

该事件根本没有被调用。在您检查文档中,它说:

仅当消息泵正在运行时才会引发此事件。在 Windows 服务中,除非使用隐藏表单或手动启动消息泵,否则不会引发此事件。

于 2013-06-11T20:14:20.750 回答