您所问的正是 Tasks 已经在做的事情。Task 本质上是一个 lambda 的包装器,默认情况下它会排队等待在 ThreadPool 上执行。最重要的是,Tasks 添加了延续、异常处理、取消和许多便利功能,使多线程变得更加容易。
如果不想使用ThreadPool,可以创建自己的TaskScheduler,在创建新Task的时候使用。TaskScheduler 本质上是接收一个 Task 并安排它执行。
默认的 TaskScheduler 使用 ThreadPool.QueueUserWorkItem 加上一些工作窃取魔法和多队列处理。其他实现可以使用优先级队列,对最大或最小线程数设置自己的限制,或者他们的作者想要使用的任何技术。
编辑
我从一开始就没有注意到 便携式部分。所以问题是“PCL 是否提供了一个使用 ThreadPool 的 TaskScheduler 还是我必须创建自己的”?
.NET 4+ 提供了 ThreadPoolTaskScheduler。不幸的是,这似乎在 PCL 子集中缺失。看起来您可能必须创建自己的 TaskScheduler 或使用 Nuget 包来添加特定于平台的实现。
不知何故,我认为 ThreadPoolTaskScheduler 对于 Windows Phone 项目来说是一个糟糕的选择
在使用 Resharper 和 .NET 的调试符号进行一些挖掘之后,我认为 PCL 可以自行找到任何可用的平台 TaskScheduler 实现。
在 .NET 4.0 中,TaskScheduler.Default 返回一个 ThreadPoolTaskScheduler 的实例,一个内部 BCL 类。在 PCL 子集中,TaskScheduler.Default 返回 null 并且 ThreadPoolTaskScheduler 不可用。
ThreadPoolTaskScheduler 的源代码可能可以从 Microsoft 的参考源服务器获得,但您也可以在dotnetframework.org上快速浏览它
我创建了一个返回新任务的 PCL 类,并从 .NET 4.5 控制台应用程序中调用它以查看它将使用什么 TaskScheduler。我发现PCL类实际上使用了ThreadPoolTaskScheduler。
我还没有在 Windows 8 或 Windows Phone 8 项目中尝试过这个,尽管我怀疑我会得到每个平台的默认 TaskScheduler。