2009-06-19 3 views
1

누군가 아래의 코드에서 STA 스레드를 사용할 때 "OnNewMail"이벤트가 발생하지 않는 이유를 설명해주십시오. 프로그램은 Redemption 라이브러리를 사용하여 수신 Outlook 메일을 가로 채려고 시도합니다. 트레드가 STA 스레드이며 라이브러리가 같은 시간에 아무것도 할 수 없습니다 입력 대기 및 이메일이 도착하면 이벤트가 발생 할 기회가없는STA 스레드에서 실행되는 동안이 COM interop 이벤트가 발생하지 않는 이유는 무엇입니까?

class Program 
{   
    [STAThread()] // When this line is deleted the application works 
    static void Main(string[] args) 
    { 
     RDOSession session = GetSession(); 
     session.OnNewMail += Session_OnNewMail; 
     Console.ReadLine(); 
    } 

    static void Session_OnNewMail(string EntryID) 
    { 
     Console.WriteLine("New mail received"); 
    } 

    private static RDOSession GetSession() 
    { 
     var session = new RDOSession(); 
     var application = new ApplicationClass(); 

     session.MAPIOBJECT = application.Session.MAPIOBJECT; 
     return session; 
    } 
} 

답변

1

STAThread에서 실행되는 COM은 메시지 펌프를 사용하여 이벤트를 발생시키고 메서드를 호출합니다. 콘솔 응용 프로그램에서 메시지를 보낼 수있는 창이 없으므로 펌프를 직접 실행해야합니다. (.NET 동기화 방법 중 몇 가지가이 작업을 수행합니다. WaitOne 등을 살펴보십시오.)

개체가 기본 MTA 스레드 내에서 만족 스러우면 필요한 경우 사용하는 것이 좋습니다. 콘솔 응용 프로그램에서이 작업을 수행하십시오. 대신에서는 ReadLine의

- 당신은 키에 대한 설문 조사 및 펌프 메시지를이 사용 할 수 있습니다

while (Console.Read() == 0) 
{ 
    Thread.CurrentThread.Join(100); 
} 

을 ... 그러나 이것은 해킹입니다.

COM 콘솔 애플리케이션을 혼합 및 [STAThread] 비트 비린내 및 다른 문제를 일으킬 수 http://support.microsoft.com/default.aspx/kb/828988

0

문제는 메시지 펌핑과 거의 관련이 있습니다.

어떤 종류의 COM 개체 RDOSession이 (STA, MTA 등 ...)인지 알지 못하면 실제로 무엇이 진행되고 있는지 추측 할 수 있습니다.

내 생각에 RDOSession은 MTA COM 개체이며 어떻게 든 이벤트 코드가 STA 프록시 나 개체에 이벤트를 바인딩했습니다. 이것은 OnNewMail 이벤트를 발생시키는 부분이 STA 스레드로 레이즈를 마샬링해야 함을 의미합니다. 여기에는 창 메시지 전달이 관련됩니다. 차단 호출이고 메시지를 처리하지 않는 간단한 ReadLine 호출을 수행하고 있습니다. 그러므로 당신은 그 사건을 결코 얻지 못할 것입니다.

관련 문제