【发布时间】:2012-02-29 13:01:38
【问题描述】:
我的笔记本电脑有 2 个逻辑处理器,我偶然发现了这样一种情况:如果我安排了 2 个耗时超过 1 秒的任务而不指定它们长时间运行,则后续任务会在 1 秒后启动。这个超时时间可以改吗?
我知道正常的任务应该是短时间运行的——如果可能的话,比一秒钟短得多——我只是想知道我看到的是硬编码的 TPL 行为,或者我是否可以以任何方式影响这种行为,而不是长时间指定任务——正在运行。
此控制台应用程序方法应演示具有任意数量处理器的机器的行为:
static void Main(string[] args)
{
var timer = new Stopwatch();
timer.Start();
int numberOfTasks = Environment.ProcessorCount;
var rudeTasks = new List<Task>();
var shortTasks = new List<Task>();
for (int index = 0; index < numberOfTasks; index++)
{
int capturedIndex = index;
rudeTasks.Add(Task.Factory.StartNew(() =>
{
Console.WriteLine("Starting rude task {0} at {1}ms", capturedIndex, timer.ElapsedMilliseconds);
Thread.Sleep(5000);
}));
}
for (int index = 0; index < numberOfTasks; index++)
{
int capturedIndex = index;
shortTasks.Add(Task.Factory.StartNew(() =>
{
Console.WriteLine("Short-running task {0} running at {1}ms", capturedIndex, timer.ElapsedMilliseconds);
}));
}
Task.WaitAll(shortTasks.ToArray());
Console.WriteLine("Finished waiting for short tasks at {0}ms", timer.ElapsedMilliseconds);
Task.WaitAll(rudeTasks.ToArray());
Console.WriteLine("Finished waiting for rude tasks at {0}ms", timer.ElapsedMilliseconds);
Console.ReadLine();
}
这是应用程序在我的 2 proc 笔记本电脑上的输出:
Starting rude task 0 at 2ms
Starting rude task 1 at 2ms
Short-running task 0 running at 1002ms
Short-running task 1 running at 1002ms
Finished waiting for short tasks at 1002ms
Finished waiting for rude tasks at 5004ms
Press any key to continue . . .
线条:
Short-running task 0 running at 1002ms
Short-running task 1 running at 1002ms
表示有 1 秒超时或类似性质的东西,允许较短运行的任务被安排在“粗鲁”任务之上。这就是我要问的问题。
【问题讨论】:
-
请发布对不当行为的描述。
-
@AdamRobinson 嗨亚当,第一段描述了我所看到的行为 - 我不确定是否应该称其为“不当行为”,但我想知道我是否可以以任何方式影响这种行为,或者如果我需要调整使用 TPL 的期望和方法
-
对不起,我的意思是一些示例输出来演示您所描述的内容。我不太清楚你在描述什么,但看到你的控制台输出可能会更清楚。
-
@AdamRobinson 另外,如果我能更有效地提出这个问题,我会非常高兴。
-
@AdamRobinson 好的,我添加了输出 - 谢谢!
标签: c# concurrency task-parallel-library