2009-06-23 114 views
4

我正在編寫一個WPF應用程序,該應用程序對具有簡單需求的API具有可選的依賴關係;它必須在沒有STAThread屬性的線程上初始化/使用。當然,WPF需要STA來讓所有事情都變得簡單。使用WPF(其中需要STAThread)與不能與STAThread一起使用的API

在這種情況下,無論如何WPF都是必需的。僅當用戶選擇在應用程序中啓用此功能時,才需要此第三方API。這意味着一旦調用其他API,WPF應用程序就已經運行。

如果你不用[STAThread]來修飾你的主要方法,它是否會自動成爲MTA線程?在這種情況下,這是否意味着我可以創建一個新的MTA線程並使用其上的其他API?

如果這可行,那麼我猜這個API的任何事件都可以使用Dispatcher與WPF應用程序交互(用於引發需要在UI中顯示的事件等)。然而,是否有一種簡單的方法可以讓我的WPF應用程序「調用」MTA線程上的功能來進行API調用?我想我的STA線程(WPF應用程序)不能只是「伸手」到MTA線程並執行API調用?我想我的STA線程(WPF應用程序)不能僅僅「伸手」MTA線程並執行API調用?

這裏有這麼多的混淆的可能性,我會喜歡一些關於如何設計這樣的輸入的輸入!

謝謝!

[編輯7月8日]

歐凱,我有一些概念混淆在上面。線程模型當然是爲PROCESS設置的,而不是爲每個線程設置的,並且此第三方API無法使用STA進程。

目前,我從這個混亂中看到的唯一方法是編寫一個與此API通信的服務,然後使用命名管道與此服務進行通信。這根本不是微不足道的,一個醜陋的醜陋解決方法,但第三方API不受我控制。這就是人生。 :|

回答

5

是外部API的GUI API?或者只是功能等?如果是後者,那麼你可以生成一個第二個線程(也許使用一個生產者/消費者隊列)是MTA:

Thread thread = new Thread(DoSomeStuff); 
    thread.SetApartmentState(ApartmentState.MTA); 
    thread.Name = "3rd aprty API spooler"; 
    thread.Start(); 
+0

謝謝馬克 - 我會試試這個。外部API是一個電話系統,其中功能/事件需要一些時間(而不是幾秒鐘,但明顯)執行,所以這看起來像一個很好的計劃。 – 2009-06-23 08:29:25

3

您需要啓動一個新線程才能調用需要MTA線程的代碼。 你可以嘗試類似下面的內容,以方便在mta線程上調用。這將在MTA線程執行時阻塞主線程。這種效率的高低取決於您的API使用情況,因爲您每次調用它時都會啓動一個新線程。

public delegate void MtaMethod(); 

public class MtaHelper 
{ 

    public static void RunMta(MtaMethod method) 
    { 

     ManualResetEvent evnt = new ManualResetEvent(false); 

     Thread thread = new Thread(delegate() 
     { 
      method(); 
      evnt.Set(); 
     }); 

     thread.SetApartmentState(ApartmentState.MTA); 
     thread.Start(); 
     evnt.WaitOne(); 
    } 

} 

,然後你應該能夠調用您的API作爲

MtaHelper.RuntMta(() => OtherAPIMethod()); 
+0

您好,感謝您的建議。我遇到的唯一問題是阻塞,因爲其他API是需要一些時間才能完成的類型。我會嘗試這個以及壽! – 2009-06-23 08:31:28

2

我利用在WPF的DispatcherObject的。

我使用DispatcherObject的子類,然後使用MTA線程創建一個實例。這樣,我可以使用mySubclass.Invoke(...)或mySubclass.BeginInvoke(...)執行代碼將發生在我的MTA線程上。

你可以在這裏看到一個例子:

http://wpfmediakit.codeplex.com/SourceControl/changeset/view/24019#283908

需要特別注意CreateDvdPlayer靜態方法,也看基類BaseClasses.cs

+0

Morill稍後更改了解決方案以使用自己的消息泵定製`WorkDispatcher`,請參閱https://github.com/Sascha-L/WPF-MediaKit/tree/master/Source/Threading – xmedeko 2017-10-17 12:52:36

相關問題