5

LINQ 的AsParallel回报ParallelQuery。我想知道是否有可能改变这种行为,以便我可以在实际更改代码的情况下比较使用和不使用并行性运行的 LINQ 语句?这种行为应该类似于Debug.Assert- 当DEBUG未设置预处理器指令时,它会被优化。所以我希望能够在AsParallel不将其转换为ParallelQuery.

我想我可以声明自己的扩展方法(因为我不能 override AsParallel)并在其中分析该预处理器指令:

    public static class MyExtensions
    {
#if TURN_OFF_LINQ_PARALLELISM
        public static IEnumerable<T> AsControllableParallel<T>(this IEnumerable<T> enumerable)
        {
            return enumerable;
        }
#else
        public static ParallelQuery<T> AsControllableParallel<T>(this IEnumerable<T> enumerable)
        {
            return enumerable.AsParallel();
        }
#endif
    }

我想知道是否还有其他方法。我要求太多了吗?

4

2 回答 2

2

您可以创建自己的扩展方法并将它们转发到发布版本中的“真实” AsParallel 方法,并在调试版本中使用顺序方法。通过检查当前命名空间中的方法来解析扩展方法,然后搜索“外部”命名空间(仍然首选实例方法)。

   class NonParallelQuery 
    {
        IEnumerable _data;
        public NonParallelQuery(IEnumerable data)
        {
            _data = data;

        }
        public IEnumerator GetEnumerator()
        {
            return _data.GetEnumerator();
        }
    }

    static class Extensions
    {
        public static NonParallelQuery AsParallel(this IEnumerable source)
        {
#if DEBUG
            return new NonParallelQuery(ParallelEnumerable.AsParallel(source));
#else
            return new NonParallelQuery(source);
#endif
        }
    }


    public partial class Form1 : Form
    {

        public Form1()
        {
            var data = new string[] { "first", "second" };
            foreach (var str in data.Select(x => x.ToString()).AsParallel())
            {
                Debug.Print("Value {0}", str);
            }
            InitializeComponent();
        }
于 2011-11-07T22:19:05.057 回答
2

关于什么

            var result = 
                source
#if TURN_ON_LINQ_PARALLELISM
                .AsParallel()
#endif
                .Select(value => value.StartsWith("abcd"));
于 2011-11-07T22:45:19.593 回答