using System;
using System.Diagnostics;
using System.Threading;
namespace MultiCore
{
class TestAnonymousMethod
{
static int JOB_COUNT = 0;
//使用ManualResetEvent同步所有工作的完成時機
static ManualResetEvent syncEvent =
new ManualResetEvent(false);
static void Main(string[] args)
{
//做1000萬次
int TIMES = 1000 * 10000;
Stopwatch sw = new Stopwatch();
//反覆做五次以求驗證結果一致性
for (int round = 0; round < 5; round++)
{
sw.Reset();
//先填入待辦工作項目
JOB_COUNT = TIMES;
sw.Start();
for (int i = 0; i < TIMES; i++)
//排入1000萬件工作,傳統寫法
ThreadPool.QueueUserWorkItem(
new WaitCallback(NamedMethod), i);
//等待待辦工作件數為零,同步事件被觸發
syncEvent.WaitOne();
sw.Stop();
Console.WriteLine("Named Method = {0:N0}ms",
sw.ElapsedMilliseconds);
JOB_COUNT = TIMES;
syncEvent.Reset();
sw.Reset();
sw.Start();
for (int i = 0; i < TIMES; i++)
//使用Lambda演算式將計算邏輯放在匿名方法中
ThreadPool.QueueUserWorkItem(o =>
{
//隨便找點事就,就算Log10吧!
double d = Math.Log10(Convert.ToDouble(o));
//待辦工作項目減1
Interlocked.Decrement(ref JOB_COUNT);
//若沒有待辦事項,表示全部工作完成,觸發同步
if (JOB_COUNT == 0) syncEvent.Set();
}, i);
syncEvent.WaitOne();
sw.Stop();
Console.WriteLine("Anonymous Method = {0:N0}ms",
sw.ElapsedMilliseconds);
}
Console.Read();
}
static void NamedMethod(object arg)
{
double d = Math.Log10(Convert.ToDouble(arg));
Interlocked.Decrement(ref JOB_COUNT);
if (JOB_COUNT == 0) syncEvent.Set();
}
}
}