5

LINQ のAsParallel戻り値ParallelQuery. この動作を変更して、実際にコードを変更せずに、並列処理を使用した場合と使用しない場合の LINQ ステートメントの実行を比較できるようにすることは可能でしょうか? この動作は次のようになります。プリプロセッサ ディレクティブが設定されていない場合、最適化されますDebug.Assert。だから私はそれをに変換せずに同じ型を返すDEBUGことができるようにしたいと思います。AsParallelParallelQuery

独自の拡張メソッドを宣言して (オーバーライドできないため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

どうですか

            var result = 
                source
#if TURN_ON_LINQ_PARALLELISM
                .AsParallel()
#endif
                .Select(value => value.StartsWith("abcd"));
于 2011-11-07T22:45:19.593 に答える
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 に答える