der*_*khh 5 c# multithreading task-parallel-library
可能的重复:
任务和线程有什么区别?
我知道标题本身可能看起来是一个重复的问题,但我确实阅读了与此主题相关的所有以前的帖子,但仍然不太了解程序行为。
我目前正在编写一个检查大约 1,000 个电子邮件帐户的小程序。毫无疑问,我觉得多线程或多任务是正确的方法,因为每个线程/任务的计算成本并不高,但每个线程的持续时间在很大程度上依赖于网络 I/O。
我认为在这种情况下,将线程/任务的数量设置为远大于内核数量也是合理的。(i5-750 为四个)。因此,我将线程或任务的数量设置为 100。
使用 Tasks 编写的代码片段:
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);
Run Code Online (Sandbox Code Playgroud)
使用 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);
Run Code Online (Sandbox Code Playgroud)
那么这两者之间的本质区别是什么?
任务不一定对应于线程。它们将由任务库以比您的线程代码更有效的方式调度到线程池线程。
创建线程相当昂贵。任务将排队并在线程可用时重用线程,因此当一个线程正在等待网络 IO 时,它实际上可以被重用以执行另一个任务。闲置的线程是浪费的资源。您只能执行与您的处理器核心数(同时)相对应的线程数,因此 100 个线程意味着每个核心上的上下文切换至少 25 次。
如果使用任务,只需将所有 1000 个电子邮件处理任务排入队列,而不是将它们批量处理并任其处理。任务库将处理运行它的线程数。
| 归档时间: |
|
| 查看次数: |
14129 次 |
| 最近记录: |