如何让While活动在WF 4.0中异步运行

时间:2012-08-30 11:12:15

标签: .net workflow-foundation-4

我正在使用WF 4.0构建工作流程。使用重新托管的工作流设计器构建工作流。我编写了一个名为FetchSqlDataReader的自定义活动,它继承了AsyncCodeActivity

FetchSqlDataReader活动中包含多个Parallel个实例。

每个实例都执行一个存储过程并返回SqlDataReader作为其输出参数。

我希望迭代每个数据引导程序(并行)并在每次迭代期间执行一些其他活动。

我尝试使用AsyncNativeActivity。我创建了一个继承AsyncNativeActivity的自定义活动。在我的自定义BeginExecute的{​​{1}}部分中,我执行以下操作:

WhileAsyncNativeActivity

while(context.GetValue(Condition)) { context.ScheduleAction(Body); } 属于Condition类型,设置为InArgument<Boolean>
while(dataReader.Read())类型为contextNativeActivityContext类型为Body

ActivityAction包含我在重新托管的工作流设计器中拖放的其他活动。

这里的想法只要数据读取器获取值,执行BodyBody中的所有活动)

我发现调用WhileAsyncNativeActivity只调度(喘气:))Body并且不执行它。

如果我的数据阅读器有1000行,那么在context.ScheduleAction(Body)条件迭代OutOfMemory次调用几次后,我会收到while异常。

如何让While活动异步执行?有没有办法我可以调用context.ScheduleAction然后立即执行该操作(我猜不是因为WF引擎负责执行活动)。我也尝试过调用ScheduleAction,但ScheduleActivity异常

也失败了

在我找到让OutOfMemory工作的方法之前,我将数据读取器传递给从WhileAsyncNativeActivity派生的自定义活动,该活动将在内部执行读取器的迭代,然后通过反射加载一些程序集并通过传递数据读取器来调用它们的方法。然而,这意味着用这些函数编写的代码在程序集内部,不能作为最终用户可以使用工作流设计器配置的活动公开。

我不能做的东西:

  1. 无法使用数据集。检索的数据量很大(超过500,000行数据) - 每个存储过程,我并行执行其中的6个。

  2. 因为我依赖于AsyncCodeActivity我无法将我的数据转换为SqlDataReader集合,这意味着我无法使用IEnumerable

1 个答案:

答案 0 :(得分:0)

你不能创建一个List,然后将ParallelFor与async活动结合使用来处理列表吗?