【问题标题】:How do I get the While activity to run asynchronously in WF 4.0如何让 While 活动在 WF 4.0 中异步运行
【发布时间】:2012-08-30 11:12:15
【问题描述】:

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

FetchSqlDataReader 的多个实例位于 Parallel 活动中。

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

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

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

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

Condition 的类型为InArgument<Boolean>,设置为while(dataReader.Read())
contextNativeActivityContext 类型
BodyActivityAction 类型。

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

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

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

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

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

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

我不能做的事:

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

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

【问题讨论】:

    标签: .net workflow-foundation-4


    【解决方案1】:

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

    【讨论】:

    • 要创建一个列表,我必须遍历 DataReader 或一次从数据库中获取所有数据。我不能这样做,因为我正在处理大量数据。
    • 问题是你得到了价值,然后安排了行动。您需要做的是推迟读取该值,直到操作开始执行。
    • 是的。我希望在安排好身体后立即执行它,但我还没有找到方法。
    • 你能不能把DataReader传给Activity,让Activity从DataReader中获取值?这样,在 Activity 实际执行之前不会读取数据。
    • 是的,我可以这样做,但是我如何决定 Body 活动必须执行多少次?目前,使用 Async Native While Activity,我可以评估 dataReader.Read(),然后它在 Body 中保存的每个子活动都在数据读取器的该实例上工作。对于 DataReader 中的每一行,我想执行一堆活动。这些活动中的每一个都将获取数据读取器(这是一个 WF 级别的变量)并对其值进行操作。我必须创建 Async While 活动的唯一原因是因为我必须为数据读取器中的每一行执行多个活动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多