2

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

的多个实例FetchSqlDataReader在一个Parallel活动中。

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

我想迭代每个数据读取器(并行)并在每次迭代期间执行更多活动。

我尝试使用AsyncNativeActivity。我创建了一个自定义活动,它继承了AsyncNativeActivity. 在BeginExecute我的 custom 部分WhileAsyncNativeActivity,我执行以下操作:

while(context.GetValue(Condition))
{
    context.ScheduleAction(Body);
}

ConditionInArgument<Boolean>是设置为 的类型while(dataReader.Read())
context是类型NativeActivityContext
Body是类型ActivityAction。包含我在重新托管的工作流设计器中拖放的其他活动

Body

这里的想法是只要数据读取器获取值,执行Body(所有活动WhileAsyncNativeActivity

我发现context.ScheduleAction(Body)只调用时间表(喘气:)) Body 而不会执行它。

如果我的数据阅读器有 1000 行,在条件迭代调用几次OutOfMemory后我会得到一个异常。whilecontext.ScheduleAction

如何让 While 活动异步执行?有没有办法我可以调用ScheduleAction然后立即执行该操作(我猜不是因为 WF 引擎负责活动执行)。我也试过打电话,ScheduleActivity也失败了OutOfMemory

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

我不能做的事情:

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

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

4

1 回答 1

0

您不能创建一个列表,然后将 ParallelFor 与异步活动结合使用来处理该列表吗?

于 2012-08-31T17:59:26.847 回答