Capturando o encadeamento principal SynchronizationContext ou Dispatcher de uma biblioteca

Eu tenho uma biblioteca c # que gostaria de ter a capacidade de enviar / postar o trabalho para o thread ui "principal" (se houver). Esta biblioteca pode ser usada por:

Um aplicativo winformsUm aplicativo nativo (com interface do usuário)Um aplicativo de console (sem interface do usuário)

Na biblioteca, gostaria de capturar algo (Um SynchronizationContext, um Dispatcher, um Agendador de Tarefas ou qualquer outra coisa) durante a inicialização, o que me permitirá (mais tarde) Enviar / Postar trabalho para o thread principal (se o thread principal tem essa capacidade - ou seja, tem uma bomba de mensagem). Por exemplo, a biblioteca gostaria de colocar alguma UI do WinForms no thread principal se, e somente se, o aplicativo principal tiver a capacidade de eu chegar ao thread principal.

Coisas que eu tentei:

A SynchronizationContext: Capturar isso funciona bem para um aplicativo WinForms (umWindowsFormsSynchronizationContext será instalado como oAtual SynchronizationContext. Isso também funciona bem para o aplicativo de console - desde que eu possa detectar que o Current SynchronizationContext é nulo (e, portanto, sei que não tenho a capacidade de enviar / postar trabalho para o thread principal). O problema aqui é o aplicativo de UI nativo: ele tem a capacidade (ou seja, tem uma bomba de mensagens), mas o contexto de Sincronização Atual é nulo e, portanto, não posso diferenciá-lo do caso do aplicativo Console. Se eu pudesse diferenciar, então eu poderia simplesmente instalar um WindowsFormsSynchronizationContext no thread principal, e eu estou pronto para ir.A Expedidor: Capturando isso usandoAtual cria um novo SynchronizationContext. Assim, em todas as situações, recebo um Dispatcher. No entanto, para um aplicativo do console, usandoDispatcher.Invoke de um segmento de plano de fundo será interrompido (conforme o esperado). eu poderia usarDispatcher.FromThread (que não cria um Dispatcher para o encadeamento se não existir um). Mas o aplicativo de UI nativa retornará um Dispatcher nulo usando esse método e, assim, estou, novamente, impedido de distinguir o aplicativo de UI do aplicativo de console.A Agendador de tarefas: Eu poderia usarFromCurrentSynchronizationContext. Isso tem os mesmos problemas que o SynchronizationContext. Ou seja Antes de chamar FromCurrentSyncronizationContext, eu teria que verificar se o Current SynchronizationContext é nulo (que será o caso do aplicativo Console e do aplicativo ui nativo). Então, novamente, não consigo distinguir o aplicativo ui nativo do aplicativo de console.

Eu, claro, poderia ter o usuário da minha biblioteca especificar se é ou não um aplicativo de interface do usuário quando eles chamam meuInitialize método, mas eu estava esperando para evitar essa complicação para o usuário da biblioteca, se possível.

questionAnswers(4)

yourAnswerToTheQuestion