¿Por qué este evento de interoperabilidad COM no se genera mientras se ejecuta bajo un hilo STA?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

¿Puede alguien explicar por qué el evento " OnNewMail " no se genera cuando se usa un hilo STA en el código a continuación? El programa intenta utilizar la biblioteca Redemption para interceptar correos entrantes de 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;
    }
}
¿Fue útil?

Solución

COM que se ejecuta en un STAThread utiliza una bomba de mensajes para generar eventos y métodos de llamada. Cuando se encuentra en una aplicación de consola, no hay una ventana para enviar mensajes, por lo que debe ejecutar la bomba usted mismo. (Varios de los métodos de sincronización .NET lo harán por usted, eche un vistazo a WaitOne, etc.)

Si el objeto está satisfecho dentro de un subproceso MTA predeterminado, es mejor que lo use si necesita hacerlo desde una aplicación de consola.

En lugar de ReadLine, puede sondear una clave y enviar mensajes utilizando esto:

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

... pero esto es un hack.

Mezclar COM, aplicaciones de consola y [STAThread] es un poco sospechoso y puede provocar otros problemas: http://support.microsoft.com/default.aspx/kb/828988

Otros consejos

Cuando la banda de rodadura es un hilo STA y espera la entrada, la biblioteca no puede hacer nada al mismo tiempo y no tiene posibilidad de disparar el evento cuando llega un correo electrónico.

El problema casi seguramente tiene que ver con el bombeo de mensajes.

A menos que sepamos qué tipo de objeto COM RDOSession es (STA, MTA, etc.), solo podemos especular sobre lo que realmente está sucediendo.

Supongo que RDOSession es un objeto MTA COM y que de alguna manera el código del evento ha vinculado el evento a un proxy u objeto STA. Esto significa que parte de la subida del evento OnNewMail debe reunir la subida en el hilo STA. Esto implica pasar el mensaje de la ventana. Está realizando una simple llamada ReadLine que es una llamada de bloqueo y no procesará mensajes. Por lo tanto, nunca obtendrá el evento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top