Por que este evento interop não é criado enquanto estiver em execução sob um thread STA?
-
06-07-2019 - |
Pergunta
Alguém pode explicar por que o evento "OnNewmail" não é criado ao usar um thread STA no código abaixo? O programa tenta usar a biblioteca de resgate para interceptar e -mails do 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;
}
}
Solução
Com execução em um Stathread usa uma bomba de mensagem para aumentar os eventos e chamar métodos. Quando, em um aplicativo de console, não há uma janela para bombear mensagens para você, então você precisa executar a bomba você mesmo. (Vários dos métodos de sincronização .NET farão isso por você - dê uma olhada no Wagone etc ...)
Se o objeto estiver feliz em um thread MTA padrão - você poderá estar melhor usando isso se precisar fazer isso em um aplicativo de console.
Em vez de readline - você pode pesquisar uma chave e bombear mensagens usando isso:
while (Console.Read() == 0)
{
Thread.CurrentThread.Join(100);
}
... Mas isso é um hack.
Mixing Com, Console Apps e [Stathread] é um pouco suspeito e podem resultar em outros problemas:http://support.microsoft.com/default.aspx/kb/828988
Outras dicas
Quando o piso é o thread STA e você aguarda a entrada, a biblioteca não pode fazer nada ao mesmo tempo e não tem chance de disparar o evento quando um email chegar.
O problema quase certamente tem a ver com o bombeamento de mensagens.
A menos que saibamos que tipo de objeto com rdosession é (STA, MTA, etc ...), podemos apenas especular sobre o que realmente está acontecendo.
Meu palpite é que o rdosession é um objeto MTA com e que de alguma forma o código do evento vinculou o evento a um proxy ou objeto STA. Isso significa que parte do aumento do evento OnNewmail deve marcar o aumento do tópico STA. Isso envolve a passagem de mensagem da janela. Você está fazendo uma chamada de leitura simples, que é uma chamada de bloqueio e não processará mensagens. Portanto, você nunca terá o evento.