2009-06-19 8 views
1

誰かが、以下のコードでSTAスレッドを使用しているときにイベント "OnNewMail"が生成されない理由を説明できますか?プログラムはRedemptionライブラリを使用して着信Outlookメールを傍受しようとします。トレッドは、STAスレッドであり、あなたはライブラリが同時に何もできない入力を待ち、電子メールが到着したときにイベントを発生する機会を持っていないSTAスレッドの実行中にこのCOM相互運用イベントが発生しないのはなぜですか?

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呼び出しを行っています。したがって、あなたは今までイベントを取得しません。

関連する問題