2

WF 4.0 を使用してワークフローを構築しています。ワークフローは、再ホストされたワークフロー デザイナーを使用して構築されます。FetchSqlDataReaderを継承するという名前のカスタム アクティビティを作成しましたAsyncCodeActivity

の複数のインスタンスがアクティビティFetchSqlDataReader内にありParallelます。

SqlDataReader各インスタンスはストアド プロシージャを実行し、出力引数としてa を返します。

各データリーダーを (並行して) 反復処理し、反復ごとにさらにいくつかのアクティビティを実行したいと考えています。

AsyncNativeActivityを使ってみました。を継承するカスタム アクティビティを作成しましたAsyncNativeActivityBeginExecuteカスタムの一部でWhileAsyncNativeActivity、次のことを行います。

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

ConditionInArgument<Boolean>に設定されているタイプwhile(dataReader.Read())です。
contextはタイプNativeActivityContext
Bodyです はタイプActivityActionです。には、再ホストされたワークフロー デザイナーでドラッグ アンド ドロップした他のアクティビティが含まれています

Body

ここでの考え方は、データ リーダーが値を取得している限り、Body(内のすべてのアクティビティWhileAsyncNativeActivity)を実行することです。

私はcontext.ScheduleAction(Body)、本体をスケジュールするだけで (あえぎ:))、それを実行しないことを発見しました。

データ リーダーに 1000 行ある場合、条件が呼び出しを数回繰り返したOutOfMemory後に例外が発生します。whilecontext.ScheduleAction

While アクティビティを非同期で実行するにはどうすればよいですか? 呼び出しScheduleActionてそのアクションをすぐに実行する方法はありますか (WF エンジンがアクティビティの実行を担当しているためではないと思います)。私も呼び出してみましたが、それも例外ScheduleActivityで失敗しますOutOfMemory

を機能させる方法が見つかるまでWhileAsyncNativeActivity、データ リーダーを派生したカスタム アクティビティに渡します。カスタム アクティビティAsyncCodeActivityは、内部でリーダーの反復を実行し、リフレクションを介していくつかのアセンブリをロードし、データ リーダーに渡してメソッドを呼び出します。 . ただし、これは、これらの関数で記述されたコードがアセンブリ内にあり、エンド ユーザーがワークフロー デザイナーを使用して構成できるアクティビティとして公開できないことを意味します。

できないこと:

  1. データセットを使用できません。取得されるデータの量は膨大です (500,000 行を超えるデータ) - ストアド プロシージャごとに、そのうちの 6 つを並行して実行しています。

  2. 私は自分のデータをコレクションにSqlDataReader変換できないことに依存しているため、これは使用できないことを意味しますIEnumerableParallelForEach

4

1 に答える 1

0

List を作成し、ParallelFor を async アクティビティと組み合わせて使用​​して、リストを処理できませんでしたか?

于 2012-08-31T17:59:26.847 に答える