2015-01-15 65 views
0

好吧,據我從線程讀取這是不可能的,但在我的情況下肯定會發生。非ui線程可以阻塞ui線程嗎?導致它凍結並變得無法響應?

根據多少後臺任務我也開始肯定影響我的GUI響應,即使他們有0相對於UI線程

所以我的問題是不要任何人有任何想法如何其他線程可以使用戶界面變得反應遲鈍?

我100%確定這些非ui線程導致其緩慢,因爲它甚至在我禁用所有gui更新事件時發生。它肯定由多少個線程在我的情況(上抓取網址任務和處理這些抓取網頁的任務),我開始

這裏實現我的UI線程,我如何啓動後臺任務:

InitializeComponent(); 

this.DataContext = this; 

ThreadPool.SetMaxThreads(10000, 10000); 
ThreadPool.SetMinThreads(10000, 10000); 

PublicVariables.initPublicVariables(); 

PublicStaticFunctions.func_initLists(); 
PublicSettings.func_init_Settings_Messages(); 

Task.Factory.StartNew(() => 
{ 
    CheckCrawlURLs.func_StartCrawlingWaitingUrls(); 
    AddUrlsToDB.func_StartUrlAddProcess(); 
    LoadCrawlingUrlsFromDatabase.func_StartLoadingUrlsFromDB(); 
    GlobalStats.startUpdatingGlobalStatValues(); 
    PagesProcessor.func_StartProcessingWaitingPages();      
}, CancellationToken.None, 
    TaskCreationOptions.LongRunning, 
    TaskScheduler.Default); 

AppDomain currentDomain = AppDomain.CurrentDomain; 
Application.Current.DispatcherUnhandledException += 
    new DispatcherUnhandledExceptionEventHandler(CloseCrashHandlers.AppDispatcherUnhandledException); 

currentDomain.UnhandledException += 
    new UnhandledExceptionEventHandler(CloseCrashHandlers.CrashCloseHandler); 

Closing += new CancelEventHandler(CloseCrashHandlers.CloseHander); 

set_Buttons_Status(); 

_timer = new Timer(updateGlobalStatistics, 
        null, 
        PublicSettings.irTimers_Delayed_Start_MiliSeconds, 
        PublicSettings.ir_RefreshUI_MS); 

WebConnectionStats.Init(); 
+0

只是不要使用太多的線程。 [這個答案](http://stackoverflow.com/a/2044198/1136211)可能會有所幫助。 – Clemens 2015-01-15 17:04:31

+0

@Clemens是的,可以解決問題,但我想知道一些事情。我有很多的CPU功率,內存和硬盤的速度。所以我希望我的軟件能吸收所有的資源,但它肯定會殺死用戶界面。應用程序工作正常。 – MonsterMMORPG 2015-01-15 17:06:04

回答

1

UI響應性嚴重受到整體機器負荷的影響。將CPU /內存使用率推向100%幾乎可以保證UI的緩慢。

你怎麼能做到這一點:

  • 運行在具有大量CPU負載
  • 運行一些內存密集型線程/進程的線程至少{CPU核心的} - 接觸了很多的內存獨特的作品(即字節間隔幾千字節)應該這樣做
  • 垃圾磁盤隨機I/O,磁盤I/O本身可能不足以正確減慢UI線程。
+0

感謝很好的建議,但我的CPU遠不是100%也是我的內存和硬盤。這就是爲什麼我想解決這個問題,以推動我的電腦限制。即使隨着任務數量的增加,用戶界面也會變得無法響應,但它仍會繼續按預期運行。 – MonsterMMORPG 2015-01-15 17:08:47

+0

亞歷克斯我改變了垃圾收集器模式到服務器模式,它作出了巨大的進步,你說什麼:D – MonsterMMORPG 2015-01-15 18:56:23

+0

@MonsterMMORPG服務器GC不需要等待所有線程停止在託管代碼據我所知 - 所以如果你有巨大線程數確實會更快。如果您使用同步Web請求,則大多數線程都會停留在本機代碼中,等待響應,從而使GC等待更慢。 – 2015-01-15 19:00:31

7

您的機器無法同時運行無限數量的線程。它只能一次運行幾次。然後它需要通過各種線程旋轉,爲每個線程分配一小段時間,以更大程度地「僞造」並行化。

你擁有的線程越多,每個人獲得的餡餅越小。如果你有足夠的線程,你最終會陷入「飢餓」的境地,每個線程的時間很少,無法做任何有效的工作,整個機器就會停止。切換線程需要花費,這加劇了這一點;機器可以達到最終花費大部分時間只是在線程之間切換的地步,而不是做高效率的工作。

爲了防止出現這種情況,您應該將創建的線程數限制在相當小的數量。如果你依賴線程池,它的調度程序一般不會創建比在你的機器上更高效的線程。

+0

謝謝我自己限制每個任務的數量。我的意思是多少會同時運行。所以這可能僅僅是因爲我開始的數字任務?但是我的cpu遠不是100%。這就是爲什麼我想推更多,但即使應用程序運行正常,ui變得無響應。 – MonsterMMORPG 2015-01-15 17:10:26

+0

用線程切換吃掉所有CPU資源確實是個好主意 - 我的理解是,速度慢是因爲計劃運行的線程越多,每個線程的運行頻率越低,而不是切片的時間本身變得太短(我認爲存在切片時間的下限...需要研究,我猜)。 – 2015-01-15 17:31:33

+0

Servy我改變了垃圾收集器模式到服務器模式,它取得了巨大的進步,你說什麼:D – MonsterMMORPG 2015-01-15 18:57:19

1

這裏的技術之一是實際上將UI和長時間運行的東西分開到單獨的進程,所以它們不會干涉。

垃圾回收器很可能會暫停所有線程來執行堆的清理,因此您會遇到延遲。

您也可以嘗試使用不同的GC模式,例如併發,背景......並查看它們如何影響性能。

也許可以提高UI線程的優先級,並降低其他工作線程的優先級,儘管有點不清楚爲什麼你有這麼多的線程。

http://msdn.microsoft.com/en-us/library/0xy59wtx%28v=vs.110%29.aspx

+0

現在這些是一些堅實的建議。你能詳細說明嗎?如何分離流程?就像你說的那樣,GB也可以成爲這件事以及我懷疑的事情之一。以及我如何設置不同的模式GB? ty非常。如果單獨的進程線程之間的通信會丟失?它看起來不可能。 – MonsterMMORPG 2015-01-15 17:55:26

+0

我更改爲服務器版本,它似乎產生了巨大的影響:D – MonsterMMORPG 2015-01-15 18:46:07

+0

我想默認的GC不是服務器版本的wpc應用程序的權利? – MonsterMMORPG 2015-01-15 18:47:44