ThreadPool.QueueUserWorkItem preferredLocal是做什么的?

时间:2018-10-11 09:09:57

标签: c# .net-core threadpool

我刚刚注意到.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)的作用是什么,它将如何影响我的代码?

1 个答案:

答案 0 :(得分:6)

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

问题描述为:

  

ThreadPool.QueueUserWorkItem总是排队到全局队列;   但是,最好能够排队等候   线程池线程时当前线程池线程的本地队列   将多余的工作项目排队。

     

理论与使用

     
      
  • 当许多线程排队时,减少了对全局队列的争用
  •   
  • 排队工作项完成后,可能会更热门的本地数据
  •   
  • 利用线程池的任务窃取
  •   
  • (即类似于Task对子Task所做的合理性)
  •   

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


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