Pregunta

Tengo una aplicación C # que usa un componente COM. Este componente COM requiere una bomba de mensajes (Application.Run ()) para realizar su procesamiento. Esto significa que se ha quedado atascado en el hilo principal. Pero recientemente descubrí que es posible iniciar otra aplicación. Ejecutar en otro hilo que tenga su propio ApplicationContext.

Por lo tanto, quiero alojar el componente COM en su propio hilo dentro de su propia aplicación. Ejecutar (), pero no puedo entender cómo comenzar las cosas en el nuevo hilo sin crear un formulario de interfaz de usuario.

El WindowsFormsSynchronizationContext que necesito comunicar con el hilo no se crea hasta Application.Run (). Pero una vez que se llama a Application.Run (), no puedo entender cómo llegar al SynchronizationContext. Si pudiera generar un solo evento en ese hilo, podría usarlo para iniciar todo (crear el objeto COM, etc.), pero no parece haber ningún lugar para engancharse al nuevo bucle de eventos sin un formulario .

He intentado todo tipo de cosas complicadas, como instalar un filtro de mensajes (no se generan mensajes en el nuevo hilo), copiar el contexto de ejecución en otro hilo e intentar recuperar el SynchronizationContext desde allí (se niega a copiar el ExecutionContext de un hilo que ya se está ejecutando), recuperando Thread.CurrentContext antes de iniciar Application.Run () y luego llamando a DoCallbBack () (el DoCallback termina en el hilo original), etc. Nada de lo que he intentado funciona.

¿Fue útil?

Solución

Bryce,

Es posible que pueda adaptar este fragmento de Anders Hejlsberg habla sobre "El futuro de C # " ;. Es una pequeña clase que agrega una bomba de mensajes a un hilo para que pueda abrir ventanas usando un bucle REPL, y tendrán una bomba de mensajes adjunta.

El código se ve así:

using System.Windows.Forms;
using System.Threading;
class UserInterfaceThread()
{
    static Form window;

    public UserInterfaceThread() 
    {
        var thread = new Thread(() => {
            window = new Form();
            var handle = window.Handle;
            Application.Run();
            });
        thread.Start();
    }
    public void Run(Action action)
    {
        window.Invoke(action);
    }
}

La discusión relacionada con este código ocurre a las 1 hora y 5 minutos de la conversación de Anders, si desea revisarla.

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