共用方式為


非泛型 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>的評估傳回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; }
}

正文(可選)
ActivityAction 型別 Object,會針對集合中的每個項目執行。 每個個別項目都會透過其 Argument 屬性傳遞至 Body。

值 (選擇性)
逐一迭代的元素集合。 確保集合的所有元素都是在運行時進行相容性檢查。

CompletionCondition(選擇性)
屬性 CompletionCondition 會在任何反覆專案完成之後進行評估。 如果評估結果為 true,則會取消排程中待處理的迭代。 如果未設定這個屬性,則 Branch 集合中的所有活動都會執行,直到完成為止。

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