下面有什么区别
ThreadPool.QueueUserWorkItem
Run Code Online (Sandbox Code Playgroud)
VS
Task.Factory.StartNew
Run Code Online (Sandbox Code Playgroud)
如果对于某些长时间运行的任务调用上述代码500次,是否意味着将占用所有线程池线程?
或者TPL(第二选项)是否足够聪明,只能占用少于或等于处理器数量的线程?
Web和Stack Overflow中有很多地方不鼓励改变ThreadPool线程或TPL 任务的优先级.特别是:
"你无法控制线程池线程的状态和优先级."
"运行时管理线程池.您无法控制线程的调度,也无法更改线程的优先级."
"你不应该改变PoolThread的文化或优先级......或者就像你没有画出或重新装修租赁汽车一样."
"在某些情况下,创建和管理自己的线程而不是使用线程池线程是合适的:(例如...)您需要一个线程具有特定的优先级."
"ThreadPool中的每个线程都以默认优先级运行,而更改ThreadPriority的代码无效."
但是,这样做很简单,调试器显示更改似乎确实存在(只要值可以回读).
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
Run Code Online (Sandbox Code Playgroud)
所以问题是,这个禁忌的具体原因是什么?
我怀疑:这样做会扰乱游泳池的微妙负载平衡假设.但这并不能解释为什么有些消息来源说你无法改变它.
为什么该方法AwakeTest需要3秒而不是1秒
public static async void AwakeTest()
{
var Do1 = Sleep(1, 1);
var Do2 = Sleep(1, 2);
var Do3 = Sleep(1, 3);
await System.Threading.Tasks.Task.WhenAll(Do1, Do2, Do3);
Console.WriteLine(await Do1);
Console.WriteLine(await Do2);
Console.WriteLine(await Do3);
}
private static async System.Threading.Tasks.Task<int> Sleep(int Seconds, int ID)
{
if (Seconds < 0)
{
throw new Exception();
}
System.Threading.Thread.Sleep(Seconds * 1000);
return ID;
}
Run Code Online (Sandbox Code Playgroud) 我知道TPL不一定为并行集中的每个任务创建一个新线程,但是它总是创建至少一个吗?例如:
private void MyFunc()
{
Task.Factory.StartNew(() =>
{
//do something that takes a while
});
DoSomethingTimely(); //is this line guaranteed to be hit immediately?
}
Run Code Online (Sandbox Code Playgroud)
编辑:澄清:是的,我的意思是保证执行的线程MyFunc()不会被用来执行//do something that takes a while.