2011-07-27 55 views
2

我想要一個可序列化的繼續,所以我可以在等待新事件時將異步工作流程醃製到磁盤。當異步工作流程正在等待let!時,它將被保存起來,同時記錄下需要喚醒的內容。除了任意內存IAsyncResult(或Task<T>等),它必須是,例如,傳入消息的過濾標準以及延續本身。沒有語言支持延續,這可能是一個壯舉。但是用計算表達式來處理明確的CPS轉換,它可能不會太棘手,甚至可能更高效。有沒有人處理過這樣的方法?繼續:我可以序列化F#異步工作流或C#異步函數的繼續嗎?

+0

你能舉一個例子來描述你在找什麼嗎? – Ankur

+0

'async {let! x = GetSimulationStartTime();讓! y = GetSimulationStopTime();返回! y-x}',其中start和stop可能相隔幾天,而且我不想明確地爲狀態機建模'type AgentState = WaitingForStart | WaitingForEnd |已完成' –

+0

AFAIK甚至沒有即時可用的選項來序列化Qutoations/Expressions - 沒有辦法在延續的一般情況下獲得此信息(您可能會在關閉中捕獲很多信息)。試想一下 - 無論如何,您都需要一種序列化每個對象的方法。如果你真的需要它,你可以自己實現它(你*可以*自己重寫異步工作流,選擇將ISerializable等待狀態保存到磁盤) - 或者如其他答案中提到的那樣查看WF。 – Carsten

回答

1

你或許可以使用MailboxProcessorAgent類型作爲接近你想要的方式。您可以使用agent.PostAndAsyncReply超時檢索當前的AgentState。如上所述,你需要讓你傳遞的對象可序列化,但是即使代表也是可序列化的。雖然內部結構與async計算無​​關。計算只會允許您以非阻塞的方式與程序中的各種代理進行交互。

Dave Thomas我一直在研究一個名爲fracture-io的庫,它將提供一些用於處理代理的開箱即用方案。我們還沒有討論過這個確切的場景,但我們可以看看在...中進行烘焙或者進行提交。 :)

我也注意到你用callcc標記了你的問題。我將該運算符的樣本發佈到fssnip,但Tomas Petricek很快就posted an example瞭解如何輕鬆地使用async進行計算。所以我不認爲callcc是這個問題的一個有用的解決方案。如果您不需要async,您可以在FSharpx中查看Continuation模塊和callcc運營商。

+0

既然'MailboxProcessor' /'Agent'確實是這裏的主意,我很鼓舞人心,但我承認我不太關注。代理人的內部狀態必須作爲委託人序列化(如你所注意的那樣) - 再次喚醒它的標準(即其等待的消息)。 –

+0

所以你需要一些方法來檢查每個項目,是否正確?這應該不難。你基本上遵循CanExecute和Execute委託的命令模式。我會和戴夫一起去看看我們是否能儘快完成這項工作。 – 2011-09-22 00:06:46

+0

如果我可以完全理解它,我很樂意與你們一起努力。雖然基本的弱點很可能是序列化委託意味着沒有工作流可以持續更長的時間比應用程序的新部署,因爲延續的結構可能會完全改變。 –

0

你看過Windows Workflow Foundation嗎?

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

這可能是你想要的技術,假設事件/消息抵達小時/天/周時期,你序列化到磁盤,以避免同時使用內存/線程。 (或者你爲什麼要這樣做?)

+2

也許太倉促判斷,但我對貓和XML過敏。這些工作流程更可能持續數秒或數分鐘,但幾小時和幾天將會很常見。在許多情況下,每個事件都要做的工作很少,但總的「狀態機」非常複雜,只需使用異步工作流即可,簡單的編程而不是手動構建的狀態機或XML legos會很好。另外,我不介意在單聲道下運行。 –

+0

在我看來,「工作流程」一詞不適合異步。我希望只在執行一些我想異步執行的IO操作時使用異步,而不是使用它們實現「工作流」,因爲您可以使用其他更好的抽象來表示工作流。 – Ankur

+1

我從來沒有真正使用過Workflow Foundation,但我想知道是否可以在包裝Workflow Foundation的F#中編寫自定義計算表達式構建器,可能不需要XML? –