我刚刚注意到,.NET核心引入了Threadpool.QueueUserWorkItem的重载,该重载采用了名为“ preferlocal”的布尔值,并允许我通过类型安全的状态对象(它具有通用参数)

MSDN documentation当前不完整,看起来像这样(为了后代-将来可能会更新):

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)
C#

public static bool QueueUserWorkItem<TState> (Action<TState> callBack, TState state, bool preferLocal);

Type Parameters TState

Parameters
callBack Action<TState>

state

preferLocal Boolean

Returns
Boolean


布尔值(preferLocal)的作用是什么,它将如何影响我的代码?

最佳答案

看来它是由this pull request所添加的,它链接到this issue(两个Github链接,“ Add ThreadPool.QueueUserWorkItem(...,bool preferredLocal)/#14214”和“为本地线程池队列添加QueueUserWorkItem /#12442” , 分别)。

问题描述为:


  ThreadPool.QueueUserWorkItem始终排队到全局队列;
  但是,最好能够排队等候
  线程池线程时当前线程池线程的本地队列
  排队额外的工作项目。
  
  原理和用法
  
  
  当有多个线程排队时,减少了全局队列上的争用
  排队工作项完成后,可能会更热门的本地数据
  利用线程池的任务窃取
  (即类似于Task对于子Task所做的合理性)
  


对我来说,感到遗憾的是,最新的内联文档(从中生成MSDN文档)不是拉取请求的先决条件。



最初构建线程池时,它只需要完成一个工作队列。但是,当将所有Task优点都引入框架中时,他们趁机将线程本地队列(和work stealing)引入到现在已重命名为全局队列的地方。看起来这是清理工作,以允许特定访问这些队列。

08-28 07:23