2011-12-16 16 views
4

我有一個WPF應用程序,它使用幾個後臺線程來預編譯LINQ查詢並預先存儲一些值,稍後將需要。 TPL被使用來啓動這些任務:沉重的TPL後臺線程在WPF的用戶界面線程產生滯後

var newTask = new Task(taskAction, myCancelToken, TaskCreationOptions.LongRunning); 
newTask.Start(); 

這工作,任務分佈在幾個CPU內核等。但是,這些線程會導致高CPU負載,那就是在用戶界面,這往往絆倒察覺甚至凍結,只要線程沒有完成。

那麼,什麼可能是一個合理的方式來平滑UI。通過研究發現,那個人不應該給線程特別的優先權。其他人的意思是,經常使用Thread.Sleep()是要走的路,這對我來說似乎有點陳腐和詭詐。

有沒有額外的方式我不知道?線程優化是否存在真正的缺點(這不可能通過TPL直接實現,afaik)?

在此先感謝!

+1

`TaskCreationOptions.LongRunning`創建新線程而不是使用線程池。你開始多少個線程,你的目標機器有多少個核心? – 2011-12-16 09:38:21

+0

我開始約十或十二個任務。 LongRunning模式只是一個嘗試,我沒有開始,並有相同的結果。核心數量可能不同,因爲沒有特殊的專用目標系統設置。 – 2011-12-16 10:56:35

回答

0

10個線程是在說一個4核的機器太多了。如果它們像預編譯查詢那樣受計算限制,則它們都將爭奪cpu時間並使整個機器無響應。

我建議你使用Environment.ProcessorCount找出有多少個核心可用,並且一次只啓動(那個數字-1)線程。您可以優先考慮哪些工作首先運行,並將其他工作排列爲延續。

這將讓一個核心免費爲您的UI線程提供服務,並且應該讓應用程序再次響應。

1

關於任務的優先次序,你可以做像水木清華 http://blogs.microsoft.co.il/blogs/bnaya/archive/2011/01/29/how-to-schedule-task-on-different-thread-priority.aspx

但不建議線程的優先級的AFAIK明確改變做法

+1

我讀過關於不推薦更改線程優先級的內容。但是,爲什麼,因爲這是真的可能?那麼,這是否意味着,如果有很多背景工作要做,我只能忍受一個表現不佳的UI? – 2011-12-16 10:59:05