2011-07-27 11 views
2

シリアライズ可能な継続が必要なので、新しいイベントを待っている間に非同期ワークフローをディスクにピクルすることができます。非同期ワークフローがlet!で待機しているときには、それを復帰させるために必要なもののレコードとともに保存されます。任意のメモリ内のIAsyncResult(またはTask<T>など)の代わりに、それは、例えば、受信メッセージのフィルタ基準であり、継続自体と一緒になければなりません。継続の言語サポートがなければ、これは素晴らしいことかもしれません。しかし、明示的なCPS変換を扱う計算式では、それほどトリッキーではなく、より効率的でもあります。誰かがこのようなアプローチに取り組んでいますか?続き:F#asyncワークフローまたはC#async関数で継続をシリアル化できますか?

+0

あなたは、あなたが探しているものの詳細を記述できる例を提供できますか? – Ankur

+0

'async {let! x = GetSimulationStartTime();さあ! y = GetSimulationStopTime();リターン! y-x} '、ここでstartとstopは何日か離れているかもしれませんが、私は明示的に状態マシンをモデル化したくありません' type AgentState = WaitingForStart | WaitingForEnd | Completed' –

+0

AFAIK Qutoations/Expressionsをシリアライズするためのすぐに使えるオプションはありません。継続の一般的なケース(クロージャ内で多くをキャプチャする可能性があります)では、これを取得することはできません。それを考えてみてください。あなたは何があってもすべてのオブジェクトを直列化する方法が必要です。本当に必要な場合は、あなた自身で実装するか(非同期ワークフローを自分自身で書き直して、ディスクにISerializable待機状態を保存するオプションを使用することもできます)、他の答えで述べたように実際にWFを調べることができます。 – Carsten

答えて

1

MailboxProcessorまたはAgentを使用して、目的に近づけることができます。その後、agent.PostAndAsyncReplyをタイムアウトとともに使用して、現在のAgentStateを取得することができます。上で述べたように、渡すオブジェクトをシリアライズ可能にする必要がありますが、デリゲートさえもシリアライズ可能です。しかし、内部は実際にはasyncの計算とは無関係です。 asyncの計算では、プログラム内のさまざまなエージェントと非ブロッキングのやり方でやりとりすることができます。

Dave Thomasと私はfracture-ioというライブラリで作業しています。これは、エージェントを扱うためのいくつかのすぐに使用できるシナリオを提供します。私たちはまだこの正確なシナリオについては議論していませんでしたが、おそらくこれを焼くか、コミットすることができます。 :)

あなたの質問にcallccとタグ付けしたことに気付きました。 fssnipにその演算子のサンプルを掲載しましたが、はすぐにasyncの計算で破るのが簡単です。だから私はcallccがこの質問のための有用な解決策だとは思わない。 asyncが必要ない場合は、Continuationモジュールの場合はFSharpx、そこにはcallccオペレータが表示されます。

+0

'MailboxProcessor' /' Agent'は本当にここのアイデアなので、私は励まされますが、私はそれほどよくはないと私は認めます。エージェントの内部状態は、再度起きるための基準(つまり、待機しているメッセージ)に沿って、デリゲート(可能であると思われる)として直列化する必要があります。 –

+0

だから、それぞれのアイテムをもう一度調べるには何らかの方法が必要でしょうか?それは難しいことではありません。基本的にCanExecuteとExecuteデリゲートのコマンドパターンに従っています。私はDaveと話をして、すぐにこれを解読できるかどうかを見てみましょう。 –

+0

もし私が頭の中で完全に頭を上げることができれば、私はあなたと一緒に仕事をしてうれしいです。基本的な弱点は、シリアライズされたデリゲートは、継続の構造が完全に変わる可能性があるため、ワークフローが新しいアプリケーションのデプロイメントより長く続くことがないということです。 –

0

Windows Workflow Foundationを見ましたか?イベント/メッセージは、時間/日/週の期間に到着していて、その間にメモリ/スレッドを使用しないように、ディスクにシリアライズしていると仮定すると、おそらくあなたがしたい技術だ

http://msdn.microsoft.com/en-us/netframework/aa663328.aspx

。 (それ以外の理由は何ですか?)

+2

おそらくあまりにも急いで判断が、私はネコとXMLにアレルギーです。これらのワークフローは数秒間または数分間持続する可能性が高くなりますが、数時間から数日間は一般的なものになります。多くの場合、各イベントで実行する作業は非常に少ないですが、全体的な「状態マシン」は複雑で、非同期ワークフロー、つまり手作業のステートマシンやXMLレゴの代わりに単純なプログラミングを使用するだけで十分です。また、私はMonoの下で走っても構いません。 –

+0

私の意見では、「ワークフロー」という言葉は非同期には当てはまりません。非同期的に実行するIO操作を行うときにのみ非同期を使用し、ワークフローを表現するために他のより優れた抽象化を持つことができるので、それらを使用しないようにすることが好ましいでしょう。 – Ankur

+1

私はWorkflow FoundationおそらくXMLの必要性を排除するWorkflow Foundationを包むカスタム計算式ビルダーをF#で記述することは可能でしょうか? –

関連する問題