非泛型 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> 的評估傳回 CompletionConditiontrue 活動就可以早一點完成。 在每次反覆運算完成之後,都會評估 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 屬性傳遞至 Body。

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> 活動所提供的設計工具類似。 此設計工具出現在工具箱的 [範例]、[非泛型活動] 類別中。 在工具箱中,此設計工具名稱為 ParallelForEachWithBodyFactory,因為活動會公開工具箱中的 IActivityTemplateFactory,它會建立有適當設定之 ActivityAction 的活動。

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. 建置並執行專案。