本文共 1711 字,大约阅读时间需要 5 分钟。
我們知道 可以使用linq的 AsParallel()啟用平行作業(Plinq),系統會自動啟用一定數量的線程去執行相應操作。它適用于有延時作業的操作。但記住:對于沒有延時操作的作業,還是老老實實用AsEnumrable()吧,因為線程 的分配,啟動,回收等反而增加了執行時間和資源。
例子1:平行作業。要注意 每次執行平行作業可能不會按順序private void button7_Click(object sender, EventArgs e) { Stopwatch sw = Stopwatch.StartNew(); Console.WriteLine("begin"); var query = Enumerable.Range(1, 10).AsParallel().Select(o => { //平行作業 //Console.WriteLine("作業 " + o.ToString ()); Thread.Sleep(1000); //模擬延時事件 return o; } ).ToArray (); Console.WriteLine("end"); Console.WriteLine("times:" + sw.ElapsedMilliseconds.ToString()); }
看下結果,耗時2秒多,開了8個線程 。
begin
end times:2165 The thread 0x48e0 has exited with code 0 (0x0). The thread 0x551c has exited with code 0 (0x0). The thread 0x4378 has exited with code 0 (0x0). The thread 0x4668 has exited with code 0 (0x0). The thread 0x474c has exited with code 0 (0x0). The thread 0x3634 has exited with code 0 (0x0). The thread 0x419c has exited with code 0 (0x0). The thread 0x57a0 has exited with code 0 (0x0).例子2,不使用平行作業
private void button7_Click(object sender, EventArgs e) { Stopwatch sw = Stopwatch.StartNew(); Console.WriteLine("begin"); var query = Enumerable.Range(1, 10).AsEnumerable().Select(o => { //平行作業 // Console.WriteLine("作業 " + o.ToString ()); Thread.Sleep(1000); //模擬延時事件 return o; } ).ToArray (); Console.WriteLine("end"); Console.WriteLine("times:" + sw.ElapsedMilliseconds.ToString()); }
結果耗時 10秒
begin end times:10018转载地址:http://cimdi.baihongyu.com/