PLINQ'te Birleştirme Seçenekleri

Bir sorgu paralel olarak yürütülürken PLINQ, birden çok iş parçacığının genellikle ayrı iş parçacıklarında aynı anda farklı parçalar üzerinde çalışabilmesi için kaynak diziyi bölümler. Sonuçlar bir iş parçacığında (Visual Basic'te) bir döngüde kullanılacaksa, her iş parçacığının sonuçları tek bir foreachFor Each sırayla birleştirilmelidir. PLINQ'un gerçekleştirdiği birleştirme türü, sorguda bulunan işleçlere bağlıdır. Örneğin, sonuçlara yeni bir sıra uygulayan işleçler tüm iş parçacıklarındaki tüm öğeleri arabelleğe almalıdır. Tüketen iş parçacığının (aynı zamanda uygulama kullanıcısınınkidir) perspektifinden bakıldığında, tam arabelleğe alınan bir sorgu, ilk sonucunu vermeden önce fark edilebilir bir süre çalıştırılabilir. Varsayılan olarak diğer işleçler kısmen arabelleğe alınıyor; sonuçları toplu olarak verir. Bir işleç varsayılan ForAll olarak arabelleğe alınmaz. Tüm iş parçacıklarındaki tüm öğeleri hemen verir.

Aşağıdaki örnekte gösterildiği gibi yöntemini kullanarak WithMergeOptions PLINQ'a ne tür bir birleştirme gerçekleştirildiğini gösteren bir ipucu sağlayabilirsiniz.

var scanLines = from n in nums.AsParallel()
                    .WithMergeOptions(ParallelMergeOptions.NotBuffered)
                where n % 2 == 0
                select ExpensiveFunc(n);
Dim scanlines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
                Where n Mod 2 = 0
                Select ExpensiveFunc(n)

Örneğin tamamı için bkz . Nasıl yapılır: PLINQ'ta Birleştirme Seçeneklerini Belirtme.

Belirli bir sorgu istenen seçeneği desteklemiyorsa, seçenek yalnızca yoksayılır. Çoğu durumda, PLINQ sorgusu için birleştirme seçeneği belirtmeniz gerekmez. Ancak bazı durumlarda, sorguların varsayılan olmayan modda en iyi şekilde yürütüldüğünü test ederek ve ölçerek bulabilirsiniz. Bu seçeneğin yaygın kullanımlarından biri, daha hızlı yanıt veren bir kullanıcı arabirimi sağlamak için öbek birleştirme işlecini sonuçlarını akışa almak için zorlamaktır.

ParallelMergeOptions

Numaralandırma, ParallelMergeOptions desteklenen sorgu şekilleri için sonuçlar bir iş parçacığında kullanıldığında sorgunun son çıkışının nasıl verileceğini belirten aşağıdaki seçenekleri içerir:

  • Not Buffered

    seçeneği, NotBuffered işlenen her öğenin, oluşturulur üretilmeye başlamaz her iş parçacığından döndürülür. Bu davranış, çıkışı "akışa" benzetir. AsOrdered İşleç sorguda varsa, NotBuffered kaynak öğelerin sırasını korur. Kullanılabilir oldukları anda sonuç vermeye başlasa NotBuffered da, tüm sonuçları üretme süresi diğer birleştirme seçeneklerinden birini kullanmaktan daha uzun olabilir.

  • Auto Buffered

    seçeneği AutoBuffered , sorgunun bir arabelleğe öğe toplamasına ve ardından arabellek içeriğinin tümünü bir kerede tüketen iş parçacığına düzenli aralıklarla döndürmesine neden olur. Bu, kaynak verileri "akış" davranışını NotBufferedkullanmak yerine "öbekler" içinde vermeye benzer. AutoBuffered , ilk öğenin tüketen iş parçacığında kullanılabilir duruma getirmekten daha NotBuffered uzun sürebilir. Arabelleğin boyutu ve tam verim davranışı yapılandırılamaz ve sorguyla ilgili çeşitli faktörlere bağlı olarak değişebilir.

  • FullyBuffered

    seçeneği, FullyBuffered öğelerden herhangi biri getirilmeden önce sorgunun tamamının çıktısının arabelleğe alınmasına neden olur. Bu seçeneği kullandığınızda, ilk öğenin tüketen iş parçacığında kullanılabilir olması daha uzun sürebilir, ancak tüm sonuçlar diğer seçenekler kullanılarak elde edilenden daha hızlı üretilebilir.

Birleştirme Seçeneklerini Destekleyen Sorgu İşleçleri

Aşağıdaki tabloda, belirtilen kısıtlamalara tabi olarak tüm birleştirme seçeneği modlarını destekleyen işleçler listelenmiştir.

Operatör Kısıtlamalar
AsEnumerable Hiçbiri
Cast Hiçbiri
Concat Yalnızca Dizi veya Liste kaynağı olan sıralı olmayan sorgular.
DefaultIfEmpty Hiçbiri
OfType Hiçbiri
Reverse Yalnızca Dizi veya Liste kaynağı olan sıralı olmayan sorgular.
Select Hiçbiri
SelectMany None
Skip None
Take None
Where Hiçbiri

Diğer tüm PLINQ sorgu işleçleri, kullanıcı tarafından sağlanan birleştirme seçeneklerini yoksayabilir. Örneğin ve OrderBygibi bazı sorgu işleçleri, Reverse tümü üretilip yeniden sıralanana kadar herhangi bir öğeyi veremez. Bu nedenle, gibi Reversebir işleç de içeren bir sorguda kullanıldığında, ParallelMergeOptions birleştirme davranışı, işleç sonuçlarını oluşturana kadar sorguya uygulanmaz.

Bazı işleçlerin birleştirme seçeneklerini işleçleri, kaynak dizisinin türüne ve işlecin sorguda daha önce kullanılıp kullanılmadığına AsOrdered bağlıdır. ForAll her zamandır NotBuffered ; öğelerini hemen verir. OrderBy her zaman FullyBufferedolur; sonuç vermeden önce listenin tamamını sıralamalıdır.

Ayrıca bkz.