我正在將沒有任何多線程支持的單線程API集成到多線程程序中。我想在主線程上保留所有的API交互,並在其他線程上做其他事情。但是我正在使用的程序有一個生產者 - 消費者導向的線程設計(我不能修改)。線程失敗問題C#
有沒有辦法讓線程切換到主線程時,我想?或者其他方式來使它工作?
我不能夠表達這個問題更清楚
我正在將沒有任何多線程支持的單線程API集成到多線程程序中。我想在主線程上保留所有的API交互,並在其他線程上做其他事情。但是我正在使用的程序有一個生產者 - 消費者導向的線程設計(我不能修改)。線程失敗問題C#
有沒有辦法讓線程切換到主線程時,我想?或者其他方式來使它工作?
我不能夠表達這個問題更清楚
您可以使用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
}
這通常是調用非線程安全代碼的可接受方式。
您可以嘗試使用(通常)由一個「主」線程處理的窗口消息。創建一個窗口,向客戶端展示模擬API方法的包裝,並在內部發送窗口消息。處理窗口消息時,請調用您的實際實現。
這就是COM單線程公寓模型的工作方式,它解決了完全相同的問題。但是,這是相當先進的解決方案。
不能重構代碼以使其線程安全嗎?我認爲這會更簡單。
這是什麼類型的應用程序? WinForms,WPF,ASP.NET,Silverlight,Windows Phone 7,Zune,XBox 360,Windows 8 Metro,......? –
IT是一個程序API和另一個程序之間相當低級的適配器。頂層是WPF – Brent