Capturando el hilo principal SynchronizationContext o Dispatcher de una biblioteca

Tengo una biblioteca de C # que quisiera poder enviar / publicar trabajos al hilo "principal" de la interfaz de usuario (si existe). Esta biblioteca puede ser utilizada por:

Una aplicación winforms.Una aplicación nativa (con UI)Una aplicación de consola (sin interfaz de usuario)

En la biblioteca me gustaría capturar algo (A SynchronizationContext, un Dispatcher, un Task Scheduler, o algo más) durante la inicialización, que me permitirá (más tarde) enviar / publicar trabajos al hilo principal (si el el hilo principal tiene esa capacidad (es decir, tiene un mensaje de bombeo). Por ejemplo, la biblioteca desea incluir alguna interfaz de usuario de Winforms en el subproceso principal solo si la aplicación principal tiene la capacidad de acceder al subproceso principal.

Cosas que he probado:

A SincronizaciónContexto: Capturar esto funciona bien para una aplicación Winforms (unWindowsFormsSynchronizationContext será instalado como elCorriente SincronizaciónContexto. Esto también funciona bien para la aplicación de la consola, ya que puedo detectar que el Current SynchronizationContext es nulo (y, por lo tanto, sé que no tengo la capacidad de enviar / publicar trabajos al hilo principal). El problema aquí es la aplicación de interfaz de usuario nativa: tiene la capacidad (es decir, tiene una bomba de mensajes), pero el contexto de sincronización actual es nulo y, por lo tanto, no puedo diferenciarlo del caso de la aplicación de la Consola. Si pudiera diferenciar, entonces simplemente podría instalar un WindowsFormsSynchronizationContext en el hilo principal, y estoy listo.A Transportista: Capturando esto usandoCorriente crea un nuevo SynchronizationContext. Por lo tanto, en todas las situaciones voy a recuperar un Dispatcher. Sin embargo, para una aplicación de consola, usandoDispatcher.Invoke De un hilo de fondo se colgará (como se espera). Podría usarDispatcher.FromThread (que no crea un Dispatcher para el hilo si no existe). Pero la aplicación de interfaz de usuario nativa devolverá un Dispatcher nulo utilizando este método, y entonces, nuevamente, no puedo distinguir la aplicación de interfaz de usuario de la aplicación de consola.A Programador de tareas: Podría usarFromCurrentSynchronizationContext. Esto tiene los mismos problemas que el SynchronizationContext. Es decir. Antes de llamar a FromCurrentSyncronizationContext, tendría que comprobar si el Current SynchronizationContext es nulo (como será el caso de la aplicación de la Consola y la aplicación de la interfaz de usuario nativa). Entonces, de nuevo, no puedo distinguir la aplicación ui nativa de la aplicación de consola.

Yo, por supuesto, podría hacer que el usuario de mi biblioteca especifique si es una aplicación de UI cuando llama a miInitialize Método, pero esperaba evitar esa complicación para el usuario de la biblioteca si es posible.

Respuestas a la pregunta(4)

Su respuesta a la pregunta