我有一個C#庫,希望能夠發送/張貼工作到「主」UI線程(如果存在)。 這個庫可以通過使用:從庫中捕獲主線程SynchronizationContext或Dispatcher
- WinForms應用程序
- 本地應用程序(與UI)
- 控制檯應用程序(沒有UI)
在圖書館我想喜歡在初始化過程中捕獲某些內容(A SynchronizationContext,Dispatcher,Task Scheduler或其他),這將允許我(稍後)發送/發佈工作到主線程(如果主線程具有該能力 - - 它有一個消息泵)。例如,當且僅當主應用程序有能力讓我進入主線程時,庫纔會在主線程上放置一些Winforms UI。
事情我已經嘗試:
- 一個SynchronizationContext: 捕捉這工作正常的WinForms應用程序(一WindowsFormsSynchronizationContext將被安裝爲Current的SynchronizationContext這也工作正常的控制檯應用程序 - 因爲我可以檢測到Current SynchronizationContext爲空(因此,我知道我沒有能力向主線程發送/發佈工作)。這裏的問題是本地UI應用程序:它有能力(即它有一個消息泵),但當前同步上下文是空的,因此我無法區分它與控制檯應用程序的情況。如果我能區分,那麼我可以簡單地在主線程上安裝WindowsFormsSynchronizationContext,我很高興。
- A Dispatcher:使用Current捕獲該文件會創建一個新的SynchronizationContext。因此,在所有情況下,我都會找回一個調度員。但是,對於控制檯應用程序,從後臺線程使用
Dispatcher.Invoke
將會掛起(如預期的那樣)。我可以使用Dispatcher.FromThread
(如果線程不存在,則不會爲線程創建分派器)。但是,本地UI應用程序將使用此方法返回一個空分派器,因此我再次陷入不能將UI應用程序與控制檯應用程序區分開來。可以使用FromCurrentSynchronizationContext。這與SynchronizationContext有相同的問題。即在調用FromCurrentSyncronizationContext之前,我必須檢查Current SynchronizationContext是否爲null(控制檯應用程序和本地ui應用程序將會是這種情況)。因此,我再也無法從控制檯應用程序中區分本地ui應用程序。
我,當然,也有我的媒體庫的用戶指定它是否是當他們打電話給我Initialize
方法的UI應用程序,但我希望以避免併發症的可能的話文庫的用戶。
我在MFC中使用C#庫。這個庫調用了TaskScheduler.FromCurrentSynchronizationContext()。當我運行MFC應用程序時,它會拋出異常,說'當前的SynchronizationContext不能用作TaskScheduler'。任何想法如何處理它?我沒有直接在MFC中使用C#庫,但我已經在託管C++中創建了一個包裝器,並且我在MFC應用程序中使用了這個包裝器。 –