using System;
using System.Text;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Linq;
namespace Test
{
class Program
{
public static string DateTime_Now_ToString()
{
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
/// <summary>
/// 并行化LINQ查询
/// </summary>
static void Main()
{
var list = GetTypes();
Console.WriteLine();
Console.WriteLine(DateTime_Now_ToString());
Stopwatch sw = new Stopwatch();
sw.Start();
var query = from t in list
select WorkProcessing(t);//耗时循环
Console.WriteLine(query.Count().ToString());
foreach (var item in query)
{
//线程Id:9, 线程池:False, 后台线程:False
PrintInfo(item);
}
sw.Stop();
Console.WriteLine("LINQ耗时:{0},计时:{1}", sw.ElapsedMilliseconds.ToString(), sw.ElapsedTicks.ToString());
Console.WriteLine();
Console.WriteLine(DateTime_Now_ToString());
sw.Reset(); sw.Start();
var parallelQuery = from t in ParallelEnumerable.AsParallel(list)
select WorkProcessing(t);
Console.WriteLine(parallelQuery.Count().ToString());
foreach (var item in parallelQuery)
{
//线程Id:9, 线程池:False, 后台线程:False
PrintInfo(item);
}
sw.Stop();
Console.WriteLine("ParallelEnumerable.AsParallel()耗时:{0},计时:{1}", sw.ElapsedMilliseconds.ToString(), sw.ElapsedTicks.ToString());
Console.WriteLine();
Console.WriteLine(DateTime_Now_ToString());
sw.Reset(); sw.Start();
var parallelQuery2 = from t in list.AsParallel()
select WorkProcessing(t);
Console.WriteLine(parallelQuery2.Count().ToString());
parallelQuery2.ForAll(PrintInfo);
//线程Id:12, 线程池:True, 后台线程:True
sw.Stop();
Console.WriteLine("AsParallel()耗时:{0},计时:{1}", sw.ElapsedMilliseconds.ToString(), sw.ElapsedTicks.ToString());
Console.WriteLine();
Console.WriteLine(DateTime_Now_ToString());
sw.Reset(); sw.Start();
var query2 = from t in list.AsParallel().AsSequential()
select WorkProcessing(t);
Console.WriteLine(query2.Count().ToString());
foreach (var item in query2)
{
//线程Id:9, 线程池:False, 后台线程:False
PrintInfo(item);
}
sw.Stop();
Console.WriteLine("AsParallel().AsSequential()耗时:{0},计时:{1}", sw.ElapsedMilliseconds.ToString(), sw.ElapsedTicks.ToString());
Console.WriteLine("\n执行完成" + DateTime_Now_ToString());
Console.ReadLine();
}
private static void PrintInfo(string typeName)
{
Thread.Sleep(TimeSpan.FromMilliseconds(100));
}
private static string WorkProcessing(string typeName)
{
Thread.Sleep(TimeSpan.FromMilliseconds(100));
return typeName;
}
private static IEnumerable<string> GetTypes()
{
string str = "xmlsch"; //"xmlschemaobject";
var result = from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetExportedTypes()
where type.Name.StartsWith(str, StringComparison.CurrentCultureIgnoreCase)
select type.Name;
return result;
}
}
}
/*
2016-08-30 11:46:54
85
LINQ耗时:25548,计时:59746259
2016-08-30 11:47:20
85
ParallelEnumerable.AsParallel()耗时:12843,计时:30035306
2016-08-30 11:47:33
85
AsParallel()耗时:6648,计时:15547847
2016-08-30 11:47:39
85
AsParallel().AsSequential()耗时:25550,计时:59749639
执行完成2016-08-30 11:48:05
*/