다음을 통해 공유


제네릭이 아닌 ParallelForEach

.NET Framework 4.6.1은 해당 도구 상자에 ParallelForEach<T>를 포함하여 IEnumerable<T> 컬렉션을 반복할 수 있는 제어 흐름 작업 집합을 제공합니다.

ParallelForEach<T> 에서는 해당 Values 속성이 형식 IEnumerable<T>이어야 합니다. 사용자가 IEnumerable<T> 인터페이스를 구현하는 데이터 구조(예: ArrayList)를 반복하지 못하게 합니다. 제네릭이 아닌 버전은 ParallelForEach<T> 컬렉션에 있는 값 형식의 호환성을 보장하기 위해 더 많은 런타임 복잡성을 희생하면서 이 요구 사항을 극복합니다.

NonGenericParallelForEach 샘플은 제네릭 ParallelForEach<T> 이 아닌 활동 및 해당 디자이너를 구현하는 방법을 보여 줍니다. 이 작업을 사용하여 ArrayList를 반복할 수 있습니다.

ParallelForEach 작업

C#/Visual Basic foreach 문은 컬렉션의 각 요소에 대해 포함된 문을 실행하여 컬렉션의 요소를 열거합니다. WF에 해당하는 활동은 ForEach<T>ParallelForEach<T>입니다. 활동에는 ForEach<T> 값 목록과 본문이 포함됩니다. 런타임에 목록이 반복되고 목록의 각 값에 대해 본문이 실행됩니다.

ParallelForEach<T>에는 CompletionCondition이 있으며, ParallelForEach<T> 활동은 CompletionCondition의 평가 결과가 true일 경우 일찍 완료될 수 있습니다. 각 CompletionCondition 반복이 완료된 후에 평가됩니다.

대부분의 경우 작업의 제네릭 버전은 사용되는 대부분의 시나리오를 다루며 컴파일 시간에 형식 검사를 제공하기 때문에 기본 설정 솔루션이어야 합니다. 제네릭이 아닌 버전은 제네릭이 아닌 IEnumerable 인터페이스를 구현하는 형식을 반복하는 데 사용할 수 있습니다.

클래스 정의

다음 코드 예제에서는 제네릭 ParallelForEach 이 아닌 활동의 정의를 보여줍니다.

[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; }
}

본문(선택 사항)
ActivityAction 컬렉션의 각 요소에 대해 실행되는 형식Object입니다. 각 개별 요소는 Argument 속성을 통해 본문으로 전달됩니다.

값(선택 사항)
반복되는 요소의 컬렉션입니다. 컬렉션의 모든 요소가 호환되는 형식인지 확인하는 작업은 런타임에 수행됩니다.

CompletionCondition (선택 사항)
반복 CompletionCondition 이 완료되면 속성이 평가됩니다. true로 평가되면 예약된 반복 작업의 보류가 취소됩니다. 이 속성이 설정되지 않은 경우 분기 컬렉션의 모든 활동은 완료될 때까지 실행됩니다.

ParallelForEach 사용 예제

다음 코드는 애플리케이션에서 ParallelForEach 작업을 사용하는 방법을 보여 줍니다.

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 디자이너

샘플의 활동 디자이너는 기본 제공 ParallelForEach<T> 활동에 대해 제공된 디자이너와 모양이 비슷합니다. 디자이너는 샘플, 제네릭이 아닌 활동 범주의 도구 상자에 나타납니다. 도구 상자에서 이 디자이너의 이름은 ParallelForEachWithBodyFactory입니다. 왜냐하면 이 작업은 도구 상자에서 제대로 구성된 IActivityTemplateFactory 작업을 생성하는 기능을 노출하기 때문입니다.

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"
                }
            }
        };
    }
}

이 샘플을 실행하려면

  1. 선택한 프로젝트를 솔루션의 시작 프로젝트로 설정합니다.

    1. CodeTestClient 는 코드를 사용하여 활동을 사용하는 방법을 보여줍니다.

    2. DesignerTestClient 는 디자이너 내에서 활동을 사용하는 방법을 보여 줍니다.

  2. 프로젝트를 빌드하고 실행합니다.