Aracılığıyla paylaş


Genel Olmayan ParallelForEach

.NET Framework 4.6.1, araç kutusunda, koleksiyonlar arasında IEnumerable<T> yinelemeye olanak tanıyan, dahil olmak üzere ParallelForEach<T>bir dizi Denetim Akışı etkinliği gönderir.

ParallelForEach<T> özelliğinin Values türünde IEnumerable<T>olmasını gerektirir. Bu, kullanıcıların arabirimi uygulayan IEnumerable<T> veri yapıları üzerinde yinelemesini engeller (örneğin, ArrayList). Genel olmayan sürümü ParallelForEach<T> , koleksiyondaki değer türlerinin uyumluluğunu sağlamak için daha fazla çalışma zamanı karmaşıklığı pahasına bu gereksinimin üstesinden gelir.

NonGenericParallelForEach örneği, genel ParallelForEach<T> olmayan bir etkinliği ve tasarımcısını nasıl uygulayacaklarını gösterir. Bu etkinlik aracılığıyla ArrayListyinelemek için kullanılabilir.

ParallelForEach etkinliği

C#/Visual Basic foreach deyimi bir koleksiyonun öğelerini numaralandırır ve koleksiyonun her öğesi için eklenmiş bir deyim yürütür. WF eşdeğeri etkinlikleri ve ParallelForEach<T>'dirForEach<T>. Etkinlik ForEach<T> , değerlerin listesini ve gövdeyi içerir. Çalışma zamanında, liste yinelenir ve gövde listedeki her değer için yürütülür.

ParallelForEach<T>, değerini döndürürse CompletionConditiontrueetkinliğin ParallelForEach<T> erken tamamlanmasını sağlayan bir CompletionConditionöğesine sahiptir. CompletionCondition her yineleme tamamlandıktan sonra değerlendirilir.

Çoğu durumda, kullanıldığı senaryoların çoğunu kapsadığından ve derleme zamanında tür denetimi sağladığından etkinliğin genel sürümü tercih edilen çözüm olmalıdır. Genel olmayan sürüm, genel olmayan IEnumerable arabirimi uygulayan türler arasında yinelemek için kullanılabilir.

Sınıf tanımı

Aşağıdaki kod örneği, genel ParallelForEach olmayan bir etkinliğin tanımını gösterir.

[ContentProperty("Body")]
public class ParallelForEach : NativeActivity
{
    [RequiredArgument]
    [DefaultValue(null)]
    InArgument<IEnumerable> Values { get; set; }

    [DefaultValue(null)]
    [DependsOn("Values")]
    public Activity<bool> CompletionCondition
    [DefaultValue(null)]
    [DependsOn("CompletionCondition")]
    ActivityAction<object> Body { get; set; }
}

Gövde (isteğe bağlı)
ActivityActionObjecttürü, koleksiyondaki her öğe için yürütülür. Her bir öğe, Bağımsız Değişkeni özelliği aracılığıyla Gövde'ye geçirilir.

Değerler (isteğe bağlı)
Yinelenir öğeler koleksiyonu. Koleksiyonun tüm öğelerinin uyumlu türlerde olduğundan emin olmak, çalışma zamanında yapılır.

CompletionCondition (isteğe bağlı)
CompletionCondition Özelliği, herhangi bir yineleme tamamlandıktan sonra değerlendirilir. olarak değerlendirilirse true, zamanlanan bekleyen yinelemeler iptal edilir. Bu özellik ayarlanmazsa, Dallar koleksiyonundaki tüm etkinlikler tamamlanmadan yürütülür.

ParallelForEach kullanma örneği

Aşağıdaki kod, bir uygulamada ParallelForEach etkinliğinin nasıl kullanılacağını gösterir.

string[] names = { "bill", "steve", "ray" };

DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };

Activity sampleUsage =
    new ParallelForEach
    {
       Values = new InArgument<IEnumerable>(c=> names),
       Body = new ActivityAction<object>
       {
           Argument = iterationVariable,
           Handler = new WriteLine
           {
               Text = new InArgument<string>(env => string.Format("Hello {0}",                                                               iterationVariable.Get(env)))
           }
       }
   };

ParallelForEach tasarımcısı

Örneğin etkinlik tasarımcısı, yerleşik etkinlik için sağlanan tasarımcıya benzer bir görünüme sahiptir ParallelForEach<T> . Tasarımcı, Örnekler, Genel Olmayan Etkinlikler kategorisindeki araç kutusunda görünür. Tasarımcı, araç kutusunda ParallelForEachWithBodyFactory olarak adlandırılır, çünkü etkinlik düzgün yapılandırılmış ActivityActionbir ile etkinliği oluşturan araç kutusunda bir IActivityTemplateFactory kullanıma sunar.

public sealed class ParallelForEachWithBodyFactory : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new Microsoft.Samples.Activities.Statements.ParallelForEach()
        {
            Body = new ActivityAction<object>()
            {
                Argument = new DelegateInArgument<object>()
                {
                    Name = "item"
                }
            }
        };
    }
}

Örnek çalıştırmak için

  1. Seçtiğiniz projeyi çözümün başlangıç projesi olarak ayarlayın.

    1. CodeTestClient , kodu kullanarak etkinliğin nasıl kullanılacağını gösterir.

    2. Tasarım Aracı TestClient, tasarımcı içindeki etkinliğin nasıl kullanılacağını gösterir.

  2. Projeyi derleyin ve çalıştırın.