2011-09-19 105 views
0

我正在將沒有任何多線程支持的單線程API集成到多線程程序中。我想在主線程上保留所有的API交互,並在其他線程上做其他事情。但是我正在使用的程序有一個生產者 - 消費者導向的線程設計(我不能修改)。線程失敗問題C#

有沒有辦法讓線程切換到主線程時,我想?或者其他方式來使它工作?

我不能夠表達這個問題更清楚

+4

這是什麼類型的應用程序? WinForms,WPF,ASP.NET,Silverlight,Windows Phone 7,Zune,XBox 360,Windows 8 Metro,......? –

+0

IT是一個程序API和另一個程序之間相當低級的適配器。頂層是WPF – Brent

回答

1

您可以使用Control.Invoke一個工作線程有它運行在主用戶界面線程一些代碼道歉。

或者,也許你可以只使用lock同步所有訪問單線程API?

更多細節會很棒,但這些都是讓你開始的一些想法。

編輯:閱讀您的評論,最簡單的&最輕質的方式做這將是使用鎖如前所述同步後。這樣,一次只有一個線程調用第三方API。例如:

static object APILock = new object(); // global variable 

// Do this anytime you need to make calls on this non-thread-safe API: 
lock (APILock) { 
    // call the API; only one thread will run code inside the lock at a time 
} 

這通常是調用非線程安全代碼的可接受方式。

+0

所以鎖的東西沒有工作,但Control.Invoke工作很好 – Brent

+0

在我的實際代碼項目Control.Invoke不起作用,看到這個[問題](http://stackoverflow.com/questions/7517608 /控制調用-並 - 不存在 - 在最當前上下文) – Brent

0

您可以嘗試使用(通常)由一個「主」線程處理的窗口消息。創建一個窗口,向客戶端展示模擬API方法的包裝,並在內部發送窗口消息。處理窗口消息時,請調用您的實際實現。

這就是COM單線程公寓模型的工作方式,它解決了完全相同的問題。但是,這是相當先進的解決方案。

不能重構代碼以使其線程安全嗎?我認爲這會更簡單。