26.7 并行语言集成查询(PLINQ)
如果同时要处理大量项,或者每一项的处理过程都是一个耗时的计算限制的操作,那么可以从并行LINQ获得最大的利益。
静态System.Linq.ParallelEnumerable类(在System.Core.dll中定义)实现了PLINQ的所有功能。
为了让自己的Linq to Objects查询调用这些方法的并行版本,必须将自己的顺序查询(基于IEnumerable或者IEnumerable<T>)转换成并行查询(基于ParallelQuery或者ParallelQuery<T>),这是用ParallelEnumerable的AsParallel扩展方法来实现的。
using System;
using System.Linq;
using System.Reflection;
namespace ThreadStudy
{
public class Program
{
static void Main(string[] args)
{
Assembly ass = Assembly.LoadFrom( @"C:\Documents and Settings\10170660\Desktop\RdfBrowser(certificate)\RdfBrowser(certificate)\OpenLink.Data.Virtuoso.dll");
ObsoleteMethods(ass);
Console.ReadKey();
}
private static void ObsoleteMethods(Assembly assembly)
{
var query=from type in assembly.GetExportedTypes().AsParallel() //转换成并行查询
from method in type.GetMethods(BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static)
let obsoleteAttrType=typeof(ObsoleteAttribute)
where Attribute.IsDefined(method,obsoleteAttrType)
orderby type.FullName
let obsoleteAttrObj=(ObsoleteAttribute)Attribute.GetCustomAttribute(method,obsoleteAttrType)
select string.Format("Type={0}\nMethod={1}\nMessage={2}\n",type.FullName,method.ToString(),obsoleteAttrObj.Message);
foreach (var result in query) Console.WriteLine(result);
}
}
}
Output:
Type=OpenLink.Data.Virtuoso.SqlExtendedStringType
Method=System.String ToString(System.IFormatProvider)
Message=The provider argument is not used. Please use ToString().
Type=OpenLink.Data.Virtuoso.SqlExtendedStringType
Method=System.String ToString(System.String, System.IFormatProvider)
Message=The provider argument is not used. Please use ToString(String).
Type=OpenLink.Data.Virtuoso.VirtDbType
Method=System.String ToString(System.String, System.IFormatProvider)
Message=The provider argument is not used. Please use ToString(String).
Type=OpenLink.Data.Virtuoso.VirtDbType
Method=System.String ToString(System.IFormatProvider)
Message=The provider argument is not used. Please use ToString().
Type=OpenLink.Data.Virtuoso.VirtuosoPermission
Method=Void Deny()
Message=Deny is obsolete and will be removed in a future release of the .NET Fra
mework. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.
虽然不太常见,但在一个查询中,可以从执行并行操作切换回顺序操作,这是通过调用ParallelEnumerable的AsSequential方法做到的。
如果希望以并行方式处理查询结果,就应该使用ParallelEnumerable的ForAll方法处理查询。
query.ForAll(res => Console.WriteLine(res));
如果要让PLinq保持数据项的顺序,可调用ParallelEnumerable的AsOrdered方法。
AsParallel().AsOrdered()