다음을 통해 공유


비제네릭 ParallelForEach

.NET Framework 4.6.1의 도구 상자에는 IEnumerable<T> 컬렉션을 반복할 수 있도록 하는 ParallelForEach<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; }
}

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

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

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> 활동에 제공되는 디자이너와 모양이 비슷합니다. 디자이너는 샘플, 비제네릭 활동 범주의 도구 상자에 나타납니다. ActivityAction이 제대로 구성된 활동을 만드는 IActivityTemplateFactory가 활동을 통해 도구 상자에 노출되기 때문에 도구 상자에서 디자이너의 이름이 ParallelForEachWithBodyFactory입니다.

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. 프로젝트를 빌드하고 실행합니다.