【问题标题】:WPF Dispatcher and Work Stealing?WPF 调度程序和工作窃取?
【发布时间】: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


【解决方案1】:

调度程序线程是否有可能通过运行 TaskScheduler 队列中的任务来“帮忙”?

不,据我所知,这是不可能的。如果来自Task 的某些代码确实在调度程序线程上执行,那么这意味着任务必须明确地在那里调度它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多