什么是ThreadPool.QueueUserWorkItem preferLocal?

Jay*_*Jay 2 c# threadpool .net-core

我刚刚注意到.NET核心引入了Threadpool.QueueUserWorkItem的重载,它接受一个名为'preferlocal'的布尔值,并允许我传递一个类型安全的状态对象(它有一个通用参数)

MSDN文档目前尚不完整,看起来像这样(为后人-它可能在将来被更新):

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
Run Code Online (Sandbox Code Playgroud)

什么是boolean(preferLocal),它将如何影响我的代码?

Dam*_*ver 6

看起来它是由这个链接到此问题的拉取请求添加的(两个Github链接,"添加ThreadPool.QueueUserWorkItem(...,bool preferLocal)/#14214"和"为本地线程池队列添加QueueUserWorkItem /#12442",分别).

该问题描述为:

ThreadPool.QueueUserWorkItem总是排队到全局队列; 但是,当线程池线程对额外的工作项进行排队时,可以选择能够排队到当前线程池线程的本地队列.

理由和用法

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

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


首次构建线程池时,它只有一个工作队列要完成.但是,当所有的Task好处都被引入框架时,他们借此机会引入线程本地队列(和工作窃取)以及现在重命名为全局队列的队列.看起来这是清理工作,允许特定访问这些队列.

  • @Jay - 它变成了一个追逐,首先确认它不在.NET Standard中,然后在".NET Core 2.1中的新功能"和".NET Core 2.0中的新功能"中都提到了然后意味着搜索github将是找到更多关于它的唯一方法. (3认同)