STA 스레드 아래에서 실행 중이 COM 인터 로프 이벤트가 발생하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1017968

  •  06-07-2019
  •  | 
  •  

문제

아래 코드에서 STA 스레드를 사용할 때 왜 "onnewmail"이 발생하지 않는지 설명해 주시겠습니까? 이 프로그램은 구속 라이브러리를 사용하여 들어오는 Outlook 메일을 가로 채려고 시도합니다.

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;
    }
}
도움이 되었습니까?

해결책

Stathread에서 실행되는 Com은 메시지 펌프를 사용하여 이벤트와 호출 방법을 제기합니다. 콘솔 애플리케이션에서 메시지를 펌핑하는 창이 없으므로 펌프를 직접 실행해야합니다. (.NET 동기화 방법 중 일부는이 작업을 수행합니다. Waitone 등을 살펴보십시오 ...)

객체가 기본 MTA 스레드 내에서 행복한 경우 콘솔 애플리케이션 에서이 작업을 수행 해야하는 경우이를 사용하는 것이 좋습니다.

Readline 대신 -이를 사용하여 키 및 펌프 메시지를 설문 조사 할 수 있습니다.

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

...하지만 이것은 해킹입니다.

COM, 콘솔 앱 및 [Stathread]를 믹싱하는 것은 약간 비린내이며 다른 문제를 초래할 수 있습니다.http://support.microsoft.com/default.aspx/kb/828988

다른 팁

트레드가 STA 스레드이고 입력을 기다리는 경우 라이브러리는 동시에 아무것도 할 수 없으며 이메일이 도착하면 이벤트를 해고 할 기회가 없습니다.

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

우리가 어떤 유형의 com 객체 rdoSession이라는 것을 알지 못하면 (STA, MTA 등) 우리는 실제로 무슨 일이 일어나고 있는지에 대해서만 추측 할 수 있습니다.

내 생각에 RDOSESSIO는 MTA COM 객체이며 어떻게 든 이벤트 코드가 이벤트를 STA 프록시 또는 객체에 묶었다는 것입니다. 이는 Onnewmail 이벤트 인상의 일부가 STA 실로 인상을 마샬링해야 함을 의미합니다. 여기에는 창 메시지 전달이 포함됩니다. 차단 호출이며 메시지를 처리하지 않는 간단한 읽기 라인 호출을하고 있습니다. 따라서 당신은 이벤트를 얻지 못할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top