我刚刚注意到.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)的作用是什么,它将如何影响我的代码?
答案 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)引入到现在已重命名为全局队列的地方。看起来这是清理工作,以允许特定访问这些队列。