2009-06-19 7 views
1

Quelqu'un peut-il expliquer pourquoi l'événement "OnNewMail" n'est pas déclenché lors de l'utilisation d'un thread STA dans le code ci-dessous? Le programme tente d'utiliser la bibliothèque Redemption pour intercepter les messages Outlook entrants.Pourquoi cet événement COM interop n'est-il pas déclenché lors de l'exécution d'un thread STA?

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; 
    } 
} 

Répondre

1

COM s'exécutant sur un STAThread utilise une pompe de message pour déclencher des événements et des méthodes d'appel. Lorsque dans une application console, il n'y a pas de fenêtre pour pomper des messages pour vous, vous devez donc faire fonctionner la pompe vous-même. (Plusieurs des méthodes de synchronisation .NET le feront pour vous - jetez un oeil à WaitOne etc ...)

Si l'objet est content dans un thread MTA par défaut - il vaut peut-être mieux l'utiliser si vous avez besoin de faites-le à partir d'une application console.

Au lieu de ReadLine - vous pouvez scrutin pour un message clé et la pompe en utilisant ceci:

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

... mais c'est un hack.

mélange COM, les applications de la console et [STAThread] est un peu louche et peut entraîner d'autres problèmes: http://support.microsoft.com/default.aspx/kb/828988

0

Lorsque la bande de roulement est thread STA et vous attendez pour l'entrée de la bibliothèque ne peut rien faire en même temps et n'a aucune chance de déclencher l'événement lorsqu'un courriel arrive.

0

Le problème est presque certainement lié au pompage de messages. Si nous ne connaissons pas le type d'objet COM RDOSession (STA, MTA, etc ...), nous ne pouvons que spéculer sur ce qui se passe réellement.

Je suppose que RDOSession est un objet MTA COM et que le code d'événement a lié l'événement à un proxy ou à un objet STA. Cela signifie qu'une partie de l'événement OnNewMail doit déclencher l'élévation sur le thread STA. Cela implique le passage de message de fenêtre. Vous effectuez un appel ReadLine simple qui est un appel bloquant et ne traitera pas les messages. Par conséquent, vous n'obtiendrez jamais l'événement.

Questions connexes