1

以下のコードで STA スレッドを使用しているときに「OnNewMail」イベントが発生しない理由を誰か説明してもらえますか? このプログラムは、Redemption ライブラリを使用して、受信した 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;
    }
}
4

3 に答える 3

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

于 2009-06-19T13:55:28.523 に答える
0

トレッドが STA スレッドであり、入力を待機している場合、ライブラリは同時に何もできず、電子メールが到着したときにイベントを発生させる機会がありません。

于 2009-06-19T13:37:38.623 に答える
0

この問題は、ほぼ確実にメッセージ ポンピングに関係しています。

RDOSession がどのタイプの COM オブジェクト (STA、MTA など) であるかを知らない限り、実際に何が起こっているかを推測することしかできません。

私の推測では、RDOSession は MTA COM オブジェクトであり、何らかの形でイベント コードがイベントを STA プロキシまたはオブジェクトにバインドしていると思われます。これは、OnNewMail イベントの発生の一部で、発生を STA スレッドにマーシャリングする必要があることを意味します。これには、ウィンドウ メッセージ パッシングが含まれます。ブロッキング呼び出しであり、メッセージを処理しない単純な ReadLine 呼び出しを実行しています。したがって、イベントを取得することはありません。

于 2009-06-19T13:40:46.853 に答える