シリアライズ可能な継続が必要なので、新しいイベントを待っている間に非同期ワークフローをディスクにピクルすることができます。非同期ワークフローがlet!
で待機しているときには、それを復帰させるために必要なもののレコードとともに保存されます。任意のメモリ内のIAsyncResult
(またはTask<T>
など)の代わりに、それは、例えば、受信メッセージのフィルタ基準であり、継続自体と一緒になければなりません。継続の言語サポートがなければ、これは素晴らしいことかもしれません。しかし、明示的なCPS変換を扱う計算式では、それほどトリッキーではなく、より効率的でもあります。誰かがこのようなアプローチに取り組んでいますか?続き:F#asyncワークフローまたはC#async関数で継続をシリアル化できますか?
答えて
MailboxProcessor
またはAgent
を使用して、目的に近づけることができます。その後、agent.PostAndAsyncReply
をタイムアウトとともに使用して、現在のAgentState
を取得することができます。上で述べたように、渡すオブジェクトをシリアライズ可能にする必要がありますが、デリゲートさえもシリアライズ可能です。しかし、内部は実際にはasync
の計算とは無関係です。 async
の計算では、プログラム内のさまざまなエージェントと非ブロッキングのやり方でやりとりすることができます。
Dave Thomasと私はfracture-ioというライブラリで作業しています。これは、エージェントを扱うためのいくつかのすぐに使用できるシナリオを提供します。私たちはまだこの正確なシナリオについては議論していませんでしたが、おそらくこれを焼くか、コミットすることができます。 :)
あなたの質問にcallcc
とタグ付けしたことに気付きました。 fssnipにその演算子のサンプルを掲載しましたが、はすぐにasync
の計算で破るのが簡単です。だから私はcallcc
がこの質問のための有用な解決策だとは思わない。 async
が必要ない場合は、Continuation
モジュールの場合はFSharpx、そこにはcallcc
オペレータが表示されます。
'MailboxProcessor' /' Agent'は本当にここのアイデアなので、私は励まされますが、私はそれほどよくはないと私は認めます。エージェントの内部状態は、再度起きるための基準(つまり、待機しているメッセージ)に沿って、デリゲート(可能であると思われる)として直列化する必要があります。 –
だから、それぞれのアイテムをもう一度調べるには何らかの方法が必要でしょうか?それは難しいことではありません。基本的にCanExecuteとExecuteデリゲートのコマンドパターンに従っています。私はDaveと話をして、すぐにこれを解読できるかどうかを見てみましょう。 –
もし私が頭の中で完全に頭を上げることができれば、私はあなたと一緒に仕事をしてうれしいです。基本的な弱点は、シリアライズされたデリゲートは、継続の構造が完全に変わる可能性があるため、ワークフローが新しいアプリケーションのデプロイメントより長く続くことがないということです。 –
Windows Workflow Foundationを見ましたか?イベント/メッセージは、時間/日/週の期間に到着していて、その間にメモリ/スレッドを使用しないように、ディスクにシリアライズしていると仮定すると、おそらくあなたがしたい技術だ
http://msdn.microsoft.com/en-us/netframework/aa663328.aspx
。 (それ以外の理由は何ですか?)
おそらくあまりにも急いで判断が、私はネコとXMLにアレルギーです。これらのワークフローは数秒間または数分間持続する可能性が高くなりますが、数時間から数日間は一般的なものになります。多くの場合、各イベントで実行する作業は非常に少ないですが、全体的な「状態マシン」は複雑で、非同期ワークフロー、つまり手作業のステートマシンやXMLレゴの代わりに単純なプログラミングを使用するだけで十分です。また、私はMonoの下で走っても構いません。 –
私の意見では、「ワークフロー」という言葉は非同期には当てはまりません。非同期的に実行するIO操作を行うときにのみ非同期を使用し、ワークフローを表現するために他のより優れた抽象化を持つことができるので、それらを使用しないようにすることが好ましいでしょう。 – Ankur
私はWorkflow FoundationおそらくXMLの必要性を排除するWorkflow Foundationを包むカスタム計算式ビルダーをF#で記述することは可能でしょうか? –
- 1. C#async永続WebClientの例
- 2. C#asyncメソッドをF#関数に変換する
- 3. F#asyncワークフローから命令コードを削除する
- 4. F#とC#のasyncのパフォーマンス(async {...}を書く良い方法があります)
- 5. Visual C++でExecutorでboost :: asyncを使用できますか?
- 6. `Pool。* _ async`関数は決して準備ができません
- 7. ForYach関数は、Asyncの滝のMysql接続プールを持っています
- 8. Npgsqlとasyncとの同時接続数
- 9. MVVM ASYNC GUI SLQ接続
- 10. 戻り@Async方法の結果とAjaxクライアントに返す - 継続
- 11. Python 3.5 asyncioソケット接続ごとにasyncサブプロセスで作成できません
- 12. ctx.body async/await関数でundefind
- 13. async/awaitを使用して非同期サーバーに接続できません
- 14. @Asyncと@Transactionalは、すでに永続化されている永続オブジェクトを保持します。JPA
- 15. C++は継続継承スタイルをどのように使用できますか?
- 16. C内のsetcontext関数ファミリは継続していますか?
- 17. OnceAsync:正確に一度f#async関数を実行する
- 18. テンプレート関数でstd :: asyncを使用することができます
- 19. 関数からwhileループを中断または継続する
- 20. C#: "async"と "!"として実装する方法F#で?
- 21. nsIAlertsServiceを永続化できますか?
- 22. BigTable asyncから読み込むことはできますか?
- 23. オーバーライドされた関数/メソッドは引き続きアクセスできますか?
- 24. Typescript Async/SignalR関数で待機する
- 25. ブラウザでポストリクエストにDart async/awaitを使用できますか?
- 26. firebaseデータベースコールでasync awaitを使用できますか?
- 27. .NET 3.0でAsync CTPを使用できますか?
- 28. React JSでasync/awaitを使用できますか?
- 29. ブラウザでasync/awaitを検出できますか?
- 30. c#JSON.NETでシリアル化されたプライベートフィールドを継承しました
あなたは、あなたが探しているものの詳細を記述できる例を提供できますか? – Ankur
'async {let! x = GetSimulationStartTime();さあ! y = GetSimulationStopTime();リターン! y-x} '、ここでstartとstopは何日か離れているかもしれませんが、私は明示的に状態マシンをモデル化したくありません' type AgentState = WaitingForStart | WaitingForEnd | Completed' –
AFAIK Qutoations/Expressionsをシリアライズするためのすぐに使えるオプションはありません。継続の一般的なケース(クロージャ内で多くをキャプチャする可能性があります)では、これを取得することはできません。それを考えてみてください。あなたは何があってもすべてのオブジェクトを直列化する方法が必要です。本当に必要な場合は、あなた自身で実装するか(非同期ワークフローを自分自身で書き直して、ディスクにISerializable待機状態を保存するオプションを使用することもできます)、他の答えで述べたように実際にWFを調べることができます。 – Carsten