【发布时间】:2012-10-16 20:01:35
【问题描述】:
我知道标题本身可能看起来是一个重复的问题,但我确实阅读了与该主题相关的所有先前帖子,但仍然不太了解程序行为。
我目前正在编写一个检查大约 1,000 个电子邮件帐户的小程序。毫无疑问,我觉得多线程或多任务是正确的方法,因为每个线程/任务的计算成本并不高,但每个线程的持续时间很大程度上依赖于网络 I/O。
我认为在这种情况下,将线程/任务的数量设置为远大于内核数量的数字也是合理的。 (i5-750 四个)。因此,我将线程或任务的数量设置为 100。
使用Tasks编写的代码sn-p:
const int taskCount = 100;
var tasks = new Task[taskCount];
var loopVal = (int) Math.Ceiling(1.0*EmailAddress.Count/taskCount);
for (int i = 0; i < taskCount; i++)
{
var objContainer = new AutoCheck(i*loopVal, i*loopVal + loopVal);
tasks[i] = new Task(objContainer.CheckMail);
tasks[i].Start();
}
Task.WaitAll(tasks);
同样的代码sn-p用Threads写的:
const int threadCount = 100;
var threads = new Thread[threadCount];
var loopVal = (int)Math.Ceiling(1.0 * EmailAddress.Count / threadCount);
for (int i = 0; i < threadCount; i++)
{
var objContainer = new AutoCheck(i * loopVal, i * loopVal + loopVal);
threads[i] = new Thread(objContainer.CheckMail);
threads[i].Start();
}
foreach (Thread t in threads)
t.Join();
runningTime.Stop();
Console.WriteLine(runningTime.Elapsed);
那么这两者的本质区别是什么?
【问题讨论】:
-
据我了解,TaskScheduler 会将需要的线程数超过硬件所能提供的线程数的任务暂停,直到有足够的线程数可用于该任务。如果我理解正确的话,这个想法是,如果您有大量线程同时启动,它们将争夺硬件资源。任务不会发生的战斗。
-
@Marc-AndréJutras 这只是使用默认任务调度程序启动的任务的行为,它只是在线程池上运行它们。您可以拥有从不创建线程的任务,或者从不在任何其他线程中执行任何代码。
-
两个都写了,为什么不都测试一下?
-
@MartinJames 好吧,他们都会工作。如果您不知道要查找什么,可能很难真正说出它们的运行方式有何不同。
标签: c# multithreading task-parallel-library