WF 4.0 を使用してワークフローを構築しています。ワークフローは、再ホストされたワークフロー デザイナーを使用して構築されます。FetchSqlDataReader
を継承するという名前のカスタム アクティビティを作成しましたAsyncCodeActivity
。
の複数のインスタンスがアクティビティFetchSqlDataReader
内にありParallel
ます。
SqlDataReader
各インスタンスはストアド プロシージャを実行し、出力引数としてa を返します。
各データリーダーを (並行して) 反復処理し、反復ごとにさらにいくつかのアクティビティを実行したいと考えています。
AsyncNativeActivityを使ってみました。を継承するカスタム アクティビティを作成しましたAsyncNativeActivity
。BeginExecute
カスタムの一部でWhileAsyncNativeActivity
、次のことを行います。
while(context.GetValue(Condition))
{
context.ScheduleAction(Body);
}
Condition
InArgument<Boolean>
に設定されているタイプwhile(dataReader.Read())
です。
context
はタイプNativeActivityContext
Body
です はタイプActivityAction
です。には、再ホストされたワークフロー デザイナーでドラッグ アンド ドロップした他のアクティビティが含まれています
。Body
ここでの考え方は、データ リーダーが値を取得している限り、Body
(内のすべてのアクティビティWhileAsyncNativeActivity
)を実行することです。
私はcontext.ScheduleAction(Body)
、本体をスケジュールするだけで (あえぎ:))、それを実行しないことを発見しました。
データ リーダーに 1000 行ある場合、条件が呼び出しを数回繰り返したOutOfMemory
後に例外が発生します。while
context.ScheduleAction
While アクティビティを非同期で実行するにはどうすればよいですか? 呼び出しScheduleAction
てそのアクションをすぐに実行する方法はありますか (WF エンジンがアクティビティの実行を担当しているためではないと思います)。私も呼び出してみましたが、それも例外ScheduleActivity
で失敗しますOutOfMemory
を機能させる方法が見つかるまでWhileAsyncNativeActivity
、データ リーダーを派生したカスタム アクティビティに渡します。カスタム アクティビティAsyncCodeActivity
は、内部でリーダーの反復を実行し、リフレクションを介していくつかのアセンブリをロードし、データ リーダーに渡してメソッドを呼び出します。 . ただし、これは、これらの関数で記述されたコードがアセンブリ内にあり、エンド ユーザーがワークフロー デザイナーを使用して構成できるアクティビティとして公開できないことを意味します。
できないこと:
データセットを使用できません。取得されるデータの量は膨大です (500,000 行を超えるデータ) - ストアド プロシージャごとに、そのうちの 6 つを並行して実行しています。
私は自分のデータをコレクションに
SqlDataReader
変換できないことに依存しているため、これは使用できないことを意味しますIEnumerable
ParallelForEach