非泛型 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 屬性傳遞至 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"
}
}
};
}
}
若要執行範例
將您選擇的專案設定為方案的啟始專案。
CodeTestClient 說明如何透過程式碼使用活動。
DesignerTestClient 說明如何在設計工具中使用活動。
建置並執行專案。