【发布时间】:2016-11-01 19:26:42
【问题描述】:
我有一个使用 WPF 作为其 GUI 的应用程序,但是,在命令启动时,处理负载非常重。 我注意到当引擎(繁重的处理)运行时我的 GUI 相当缓慢,并且在 VS2015 中使用“应用程序时间线”工具时,我注意到我的一些引擎代码正在 UI 线程上运行。
引擎从下面一行启动,如果我理解LongRunningflag,它会创建一个新线程并在该线程上运行给定的函数。
rootTask = Task.Factory.StartNew(DoWork, TaskCreationOptions.LongRunning);
上面引用的DoWork方法反复使用Parallel.For来排队数百个任务。
调度线程是否有可能通过从 TaskScheduler 队列中运行任务来“帮助”?如果是这样,是否有可能阻止这种情况以保持 GUI 响应(尽管会损害后台任务)?
【问题讨论】:
-
可能是活动线程数太大,占用了cpu的所有核心。您最好创建几个工作线程并将您的工作项排队,而不是创建数百个线程。
-
我当然希望使用所有处理器内核,但我相信
Parrallel.For在托管线程池中排队任务,因此这些任务不应出现在 UI 线程上,并且优先级应低于调度员 -
您可以在工作线程中检查 System.Threading.Thread.CurrentThread.properties,例如 ManagedThreadId。如果一切都通过线程池,它不应该在主线程上,除非事情被分派回 ui 线程。还可以使用像 (Concurrency Visualizer) 这样的分析器来可视化线程。但请注意,大量线程会导致您的 cpu 开始在线程之间切换,并且您的进程会冻结。这可以在流程资源管理器等工具中轻松看到。
标签: wpf task-parallel-library threadpool work-stealing