我刚刚注意到,.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)引入到现在已重命名为全局队列的地方。看起来这是清理工作,以允许特定访问这些队列。