示例
Program.cs
using System.Diagnostics;
namespace TaskExample
{
internal class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
//Tasks
sw.Start();
WithTasks(100);
sw.Stop();
long timeTakenForTasks = sw.ElapsedMilliseconds;
Console.WriteLine($"\nTasks Taken: {timeTakenForTasks} ms");
//Threads
sw.Restart();
WithThreads(100);
sw.Stop();
long timeTakenForThreads = sw.ElapsedMilliseconds;
Console.WriteLine($"\nThreads Taken: {timeTakenForThreads} ms");
//Comparison
if(timeTakenForTasks < timeTakenForThreads)
{
Console.WriteLine("TPL is faster.");
}
else if (timeTakenForTasks > timeTakenForThreads)
{
Console.WriteLine("Threading is faster.");
}
else
{
Console.WriteLine("TPL and Threading is equal.");
}
Console.ReadKey();
}
static void WithTasks(int maxNo)
{
UpCounter upCounter = new UpCounter();
DownCounter downCounter = new DownCounter();
CountdownEvent countdownEvent = new CountdownEvent(2);
Task t1 = Task.Run(() =>
{
upCounter.CountUp(maxNo);
countdownEvent.Signal();
});
Task t2 = Task.Run(() =>
{
downCounter.CountDown(maxNo);
countdownEvent.Signal();
});
countdownEvent.Wait();
}
static void WithThreads(int maxNo)
{
UpCounter upCounter = new UpCounter();
DownCounter downCounter = new DownCounter();
CountdownEvent countdownEvent = new CountdownEvent(2);
Thread t1 = new Thread(() =>
{
upCounter.CountUp(maxNo);
countdownEvent.Signal();
});
Thread t2 = new Thread(() =>
{
downCounter.CountDown(maxNo);
countdownEvent.Signal();
});
t1.Start();
t2.Start();
countdownEvent.Wait();
}
}
class UpCounter
{
public void CountUp(int count)
{
Console.WriteLine("\nCount-Up starts.");
for (int i = 1; i <= count; i++)
{
Console.Write($"Up: {i}, ");
}
Console.WriteLine("\nCount-Up ends.");
}
}
class DownCounter
{
public void CountDown(int count)
{
Console.WriteLine("\nCount-Down starts.");
for (int i = count; i >= 1; i--)
{
Console.Write($"Down: {i}, ");
}
Console.WriteLine("\nCount-Down ends.");
}
}
}