Przechwytywanie głównego wątku SynchronizationContext lub Dispatcher z biblioteki

Mam bibliotekę C #, która chciałaby mieć możliwość wysyłania / wysyłania pracy do „głównego” wątku ui (jeśli taki istnieje). Z tej biblioteki mogą korzystać:

Aplikacja winformsAplikacja natywna (z interfejsem użytkownika)Aplikacja konsoli (bez interfejsu użytkownika)

W bibliotece chciałbym przechwycić coś (A SynchronizationContext, Dispatcher, Task Scheduler lub coś innego) podczas inicjalizacji, co pozwoli mi (później) wysłać / wysłać pracę do głównego wątku (jeśli główny wątek ma tę zdolność - tzn. ma pompę wiadomości). Na przykład biblioteka chciałaby umieścić w interfejsie głównym niektóre interfejsy użytkownika Winforms, jeśli tylko główna aplikacja ma możliwość przejścia do głównego wątku.

Rzeczy, które próbowałem:

A SynchronizationContext: Przechwytywanie to działa dobrze dla aplikacji Winforms (aWindowsFormsSynchronizationContext zostanie zainstalowany jakoobecny SynchronizationContext. Działa to również dobrze w przypadku aplikacji konsoli - ponieważ mogę wykryć, że Current SynchronizationContext ma wartość NULL (a zatem wiem, że nie mam możliwości wysyłania / wysyłania pracy do głównego wątku). Problemem jest natywna aplikacja interfejsu użytkownika: ma zdolność (tzn. Ma pompę wiadomości), ale kontekst bieżącej synchronizacji jest zerowy, a zatem nie mogę odróżnić go od przypadku aplikacji konsoli. Gdybym mógł rozróżnić, mógłbym po prostu zainstalować WindowsFormsSynchronizationContext w głównym wątku i dobrze jest iść.A Dyspozytor: Przechwytywanie tego użyciaobecny tworzy nowy kontekst synchronizacji. Tak więc we wszystkich sytuacjach otrzymam Dyspozytora. Jednak dla aplikacji Konsola, używającDispatcher.Invoke z wątku w tle zawiesi się (zgodnie z oczekiwaniami). mógłbym użyćDispatcher.FromThread (który nie tworzy Dispatchera dla wątku, jeśli nie istnieje). Jednak natywna aplikacja UI zwróci Null Dispatcher za pomocą tej metody, a następnie ponownie utknąłem, nie będąc w stanie odróżnić aplikacji UI od aplikacji konsoli.A Harmonogram zadań: Mógłbym użyćFromCurrentSynchronizationContext. Ma to te same problemy, co SynchronizationContext. To znaczy. Przed wywołaniem FromCurrentSyncronizationContext musiałbym sprawdzić, czy Current SynchronizationContext ma wartość NULL (tak będzie w przypadku aplikacji Console i natywnej aplikacji ui). Więc znowu nie mogę odróżnić natywnej aplikacji ui od aplikacji konsoli.

Oczywiście, mógłbym, aby użytkownik mojej biblioteki określił, czy jest to aplikacja interfejsu użytkownika, gdy nazywają mnieInitialize ale miałem nadzieję uniknąć tej komplikacji dla użytkownika biblioteki, jeśli to możliwe.

questionAnswers(4)

yourAnswerToTheQuestion