2015-01-15 99 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