2013-06-11 2 views
0

Console.WriteLine()은 차단 컴퓨터에서 SystemEvents_SessionSwitch() 처리기가 호출되는 동안 아무 것도 출력하지 않습니다. 그러나 Main() 메서드에서 Console.WriteLine() 메서드를 한 번 이상 호출하면 처리기의 메서드가 작동합니다. 이 이상한 행동/버그의 이유는 무엇입니까? 나는 윈도우 8 64 비트를 사용하고이상한 동작 SystemEvents를 사용하는 Console.WriteLine()

, .NET 프레임 워크 업데이트 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()은 콘솔에 텍스트를 출력하지 않습니다 ...

답변

3

.NET 4.5를 사용하는 문제에 대한 설명에서 알 수 있습니다. Console.ReadKey() 메소드는 4.5에서 새로운 동작을 수행하여 다른 스레드가 콘솔에 쓰고 디스플레이를 엉망으로 만들지 않도록합니다.

잠금을 사용하면 이벤트 처리기가 콘솔에 쓸 수 없습니다. 메시지 루프를 펌프하지 않는 콘솔 모드 프로그램을 사용하기 때문에 다른 스레드에서 실행됩니다. SystemEvents 클래스는 자체 이벤트를 생성하여 이벤트가 실행되도록합니다. upvoted 대답은 그것에 대해 잘못되었습니다.

쓰기를 시도하면 콘솔에 표시되지만 콘솔 창이 닫히기 전에 수 밀리 초가 지나야 볼 수 있습니다.

이 새로운 4.5 동작은 빠른 테스트 프로그램에 운명을 정해 무언가를 테스트합니다. 프로그램이 끝났음을 결정할 때 더 좋은 방법이 필요합니다. "계속하려면 아무 키나 누르십시오"라는 방법이 더 이상 잘 작동하지 않습니다. 잠금을지지 않습니다 오히려 절름발이 대안이 될 수있다 :

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

UPDATE :이 문제는 Windows Update를 통해 전달되는 .NET 4.5 업데이트에서 수정되었습니다. 정확히 언제 업데이트를 얻었는지, 2013 년 8 월경 어딘가에.

+0

대단히 감사합니다! 실제로 작동한다! 그러나 이상한 점은 실제로 4.5 버전이 아니라 네 번째 버전을 사용한다는 것입니다. 방금 프로젝트 속성으로 이동하여 다시 확인했습니다. –

+0

4.5가 설치된 경우 "앞 버전"을 사용할 수 없습니다. 4.5가 4.0을 덮어 씁니다. 프로젝트에서 4.0을 타겟팅하면 실수로 4.5 –

+0

에서 사용할 수없는 클래스를 사용하지 않게됩니다. 감사합니다. 나는 그것에 대해 모른다. –

2

이벤트는 단순히 호출되지 않습니다. 확인시 documentation은 다음과 같이 표시됩니다.

이 이벤트는 메시지 펌프가 실행 중일 때만 발생합니다. Windows 서비스에서 숨겨진 양식이 사용되거나 메시지 펌프가 수동으로 시작된 이 아닌 경우이 이벤트는 발생하지 않습니다.

+0

사실 사실은 그렇게 부름니다. 나는 특별히 핸들러에 중단 점을 넣어 이것을 점검했다. 그리고 잠긴 컴퓨터 중단 점 활성화 후. 그러나 Console.WriteLine()은 콘솔에 텍스트를 출력하지 않습니다 ... –

+0

이 MSDN 참고는 그다지 정확하지 않습니다. SystemEvents는 프로그램의 주 스레드가 작업을 완료하는 데 적합하지 않은 경우 자체 스레드를 시작하고 메시지 루프를 펌프합니다. 스레드의 아파트 상태는 C# 콘솔 모드 앱의 MTA입니다. 또한 OP가 사실상 그 해고 사실을 알게 된 이유는 무엇입니까? 그는 다른 문제가있어. –

관련 문제