Por que este evento interop não é criado enquanto estiver em execução sob um thread STA?

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

  •  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;
    }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top