2011-11-28 30 views
1

我有一個C#插件用於UML建模產品,該產品可自動繪製圖表並對其進行維護。我正在處理超過6000個圖表的大型企業模型。這需要很長時間(即使在更快的機器上)。所以我創建了一個使用後臺工作線程運行作業的「批處理」部分的版本,而「前景」模式對話允許我儘早停止處理。否則,由於建模程序的UI,我無法將「停止」消息發送到加載項。爲什麼C#後臺工作線程版本花費兩倍於單線程的時間

後臺版本似乎需要單線程版本的兩倍。實際上,我期望後臺工作者線程版本可以是多線程的,但是從我已經能夠做到的事情來看,它並不是真的在單獨的線程中運行。

模式對話框和加載項正確通信,因此兩個功能塊出現位於單獨的線程上。批處理通過DoWork方法在.RunWorkerAsync()下運行。但是如果我在代碼中放置了痕跡,他們會報告沒有在單獨的線程上運行(因爲.Invoke Required設置爲false)。

我本來會期望有少量的開銷,但不會太多(100%)。

發生了什麼事?我應該轉向真正的多線程(而不是BackgroundWorker)嗎?

TIA, 保羅

+0

BackgroundWorker在這裏應該沒問題,我們需要看一些代碼在這裏找到你的問題 –

回答

2

可能有多種原因,除非我們看到一些代碼,它很難幫助。但儘管如此,我有一些建議:

首先,後臺工作,並不意味着是*多線程」,這意味着一個線程做背景,而不是在主UI線程的工作如果。你在後臺推送的線程做了很多UI,那麼你將會有很多同步上下文切換,這會使後臺線程變得非常慢。

+0

謝謝,我猜想後臺工作人員不是真正的多線程。後臺任務必須使用建模程序的API,所以我不能真正不生成UI活動。將打開和關閉diagr並將它們顯示在工具的主工作面上 - 此外(可能)通過API更新圖表上的對象的大小和位置。我想這意味着我需要去創建一個適當的多線程情況。 – PaoloFCantoni

+0

@PaoloFCantoni:你明白了。 – Fischermaen