2012-02-08 59 views
1

創建我有我想在單獨的線程運行慢方法一個COM對象。 此方法使用在應用程序主線程中創建的COM對象的調用。運行一段代碼而不會阻塞其使用在主線程

讓我們假設是慢的代碼是這樣的:

var bwImg = image.GetBitonalImage(); // <- slow image is a COM created in main thread 
viewer.Document = bwImg; // <-- ATL control accepting the B/W COM image 

如果關鍵,我在WPF應用程序這樣做的,「觀衆」是在WinFormsHost。

我認爲這樣做將使這個異步,而不是阻止該應用程序的運行:

var t = new Thread((ThreadStart)(() => 
{ 
    var bwImg = image.GetBitonalImage(); // <- this is in separate thread 
    Dispatcher.Invoke((Action)(() => 
    { 
     viewer.Document = bwImg; // <- this again on the main 
    })); 
})); 
t.Start(); 

這是確定的我,圖片被在一段時間後表示,我並不怎麼在意很久以後。

但碰巧應用程序以相同的方式被阻止。 我做了分析和確實大部分時間都是在GetBitonalImage度過的,幾乎沒有在「viewer.Document = bwImg」。

刪除代碼完全使應用程序響應,所以它不是其他代碼錯誤。

在此之後還有其他代碼使用相同的圖像COM對象(不是黑/白的結果,但原來的)。

這是這樣做的正確方法?問題可能是因爲COM對象方法調用嗎?

回答

4

是您的COM對象的線程?如果不是,那麼它可能會在STA(單線程單元)模式下初始化,STA模式將使用STA線程來完成它的工作。所以,即使你創建了一個新線程,它也會切換回STA線程,阻止你的UI事件。如果您可以控制COM庫的源代碼,那麼只要代碼實際上是線程安全的,就可以更改這些設置。

編輯:在相關文章欄目中找到此連結,它可能適用於您。 UI thread is blocking a background thread calling a COM object

+0

看來我的情況。謝謝 – 2012-02-08 19:34:20

0

在這種情況下,正確的有很多不同的含義。 :/

問題可能是因爲COM對象的方法調用?

好吧,如果你刪除通話以及應用程序運行速度更快,然後我會說:是的..

這是這樣做的正確方法?

最好的答案是一個問題:它工作嗎?如果是這樣,那麼你可能是在正確的軌道上。

很難肯定地說,因爲我不知道COM對象的作用。它是專爲單線程操作嗎?如果多個線程創建實例,它將如何表現?換句話說,com對象本身是否線程安全?我想你會很快找到答案。

我們一個更廣泛的問題:

這是正確的方式處理長時間運行的異步進程

是的。

+0

所以你實際上說的是,對COM對象的方法調用無論如何都會在創建它的線程上運行,而不會打擾到在哪個線程中調用已經完成?我對COM對象沒有多少經驗,但是如果是這種情況,那麼我無法加速這個過程。順便說一句,它的工作原理,但它不會加快應用程序。 :D – 2012-02-08 19:28:17

+0

@MarinoŠimić:不,我認爲邁克爾說過。 ;)他是順便說一句。 – NotMe 2012-02-08 19:37:02

相關問題