我想要一個可序列化的繼續,所以我可以在等待新事件時將異步工作流程醃製到磁盤。當異步工作流程正在等待let!
時,它將被保存起來,同時記錄下需要喚醒的內容。除了任意內存IAsyncResult
(或Task<T>
等),它必須是,例如,傳入消息的過濾標準以及延續本身。沒有語言支持延續,這可能是一個壯舉。但是用計算表達式來處理明確的CPS轉換,它可能不會太棘手,甚至可能更高效。有沒有人處理過這樣的方法?繼續:我可以序列化F#異步工作流或C#異步函數的繼續嗎?
回答
你或許可以使用MailboxProcessor
或Agent
類型作爲接近你想要的方式。您可以使用agent.PostAndAsyncReply
超時檢索當前的AgentState
。如上所述,你需要讓你傳遞的對象可序列化,但是即使代表也是可序列化的。雖然內部結構與async
計算無關。計算只會允許您以非阻塞的方式與程序中的各種代理進行交互。
Dave Thomas我一直在研究一個名爲fracture-io的庫,它將提供一些用於處理代理的開箱即用方案。我們還沒有討論過這個確切的場景,但我們可以看看在...中進行烘焙或者進行提交。 :)
我也注意到你用callcc
標記了你的問題。我將該運算符的樣本發佈到fssnip,但Tomas Petricek很快就posted an example瞭解如何輕鬆地使用async
進行計算。所以我不認爲callcc
是這個問題的一個有用的解決方案。如果您不需要async
,您可以在FSharpx中查看Continuation
模塊和callcc
運營商。
既然'MailboxProcessor' /'Agent'確實是這裏的主意,我很鼓舞人心,但我承認我不太關注。代理人的內部狀態必須作爲委託人序列化(如你所注意的那樣) - 再次喚醒它的標準(即其等待的消息)。 –
所以你需要一些方法來檢查每個項目,是否正確?這應該不難。你基本上遵循CanExecute和Execute委託的命令模式。我會和戴夫一起去看看我們是否能儘快完成這項工作。 – 2011-09-22 00:06:46
如果我可以完全理解它,我很樂意與你們一起努力。雖然基本的弱點很可能是序列化委託意味着沒有工作流可以持續更長的時間比應用程序的新部署,因爲延續的結構可能會完全改變。 –
你看過Windows Workflow Foundation嗎?
http://msdn.microsoft.com/en-us/netframework/aa663328.aspx
這可能是你想要的技術,假設事件/消息抵達小時/天/周時期,你序列化到磁盤,以避免同時使用內存/線程。 (或者你爲什麼要這樣做?)
也許太倉促判斷,但我對貓和XML過敏。這些工作流程更可能持續數秒或數分鐘,但幾小時和幾天將會很常見。在許多情況下,每個事件都要做的工作很少,但總的「狀態機」非常複雜,只需使用異步工作流即可,簡單的編程而不是手動構建的狀態機或XML legos會很好。另外,我不介意在單聲道下運行。 –
在我看來,「工作流程」一詞不適合異步。我希望只在執行一些我想異步執行的IO操作時使用異步,而不是使用它們實現「工作流」,因爲您可以使用其他更好的抽象來表示工作流。 – Ankur
我從來沒有真正使用過Workflow Foundation,但我想知道是否可以在包裝Workflow Foundation的F#中編寫自定義計算表達式構建器,可能不需要XML? –
- 1. TaskCompletionSource.TrySetResult的同步或異步繼續?
- 2. 序列化異步任務和異步繼續
- 3. 繼續使用異步CTP
- 4. 等待異步塊繼續
- 5. Promise.All後,你可以繼續同步嗎?
- 6. F#異步工作流程
- 7. F#異步工作流程
- 8. 等待異步任務操作完成,並繼續當前的異步任務
- 9. 等待異步函數在繼續之前完成
- 10. 我可以在Dart中異步調用非異步函數嗎?
- 11. 異常後繼續
- 12. F#中的異步工作流程
- 13. 異步存儲無法正常工作設置或繼續React Native
- 14. F#繼續Async.Catch
- 15. C#異步文件傳輸 - 在繼續循環之前等待
- 16. 異步方法doesnt繼續以下代碼
- 17. Task.Result等待而不是繼續異步操作
- 18. F#延續繼續StackOverflowException
- 19. CasperJS - 繼續步驟超時
- 20. 繼續上一步失敗
- 21. 繼續下一步Observable onError
- 22. 異常捕捉後流量繼續
- 23. 如何繼續等待來自異步getGeolocation()函數的數據的Backbone model.save?
- 24. 我可以在git推送的同時繼續工作嗎?
- 25. GetSchema方法可以異步工作嗎?
- 26. 結合F#異步函數
- 27. 繼續執行異常
- 28. 異常後自動繼續
- 29. 繼續捕捉異常
- 30. Python異常後繼續
你能舉一個例子來描述你在找什麼嗎? – Ankur
'async {let! x = GetSimulationStartTime();讓! y = GetSimulationStopTime();返回! y-x}',其中start和stop可能相隔幾天,而且我不想明確地爲狀態機建模'type AgentState = WaitingForStart | WaitingForEnd |已完成' –
AFAIK甚至沒有即時可用的選項來序列化Qutoations/Expressions - 沒有辦法在延續的一般情況下獲得此信息(您可能會在關閉中捕獲很多信息)。試想一下 - 無論如何,您都需要一種序列化每個對象的方法。如果你真的需要它,你可以自己實現它(你*可以*自己重寫異步工作流,選擇將ISerializable等待狀態保存到磁盤) - 或者如其他答案中提到的那樣查看WF。 – Carsten