Продолжения: можно ли сериализовать продолжение в асинхронном рабочем процессе F # или асинхронной функции C #? - PullRequest
2 голосов
/ 27 июля 2011

Мне нужно сериализуемое продолжение, чтобы я мог выбирать асинхронные рабочие процессы на диск в ожидании новых событий. Когда асинхронный рабочий процесс ожидает на let!, он будет сохранен вместе с записью того, что необходимо для его активации. Вместо произвольных в памяти IAsyncResult с (или Task<T> и т. Д.) Он должен быть, например, критерием фильтрации входящих сообщений вместе с самим продолжением. Без языковой поддержки продолжений это может быть подвигом. Но с вычислительными выражениями, учитывающими явное преобразование CPS, это может быть не слишком сложно и даже может быть более эффективным. Кто-нибудь сталкивался с таким подходом?

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

Вы, вероятно, могли бы использовать тип MailboxProcessor или Agent, чтобы приблизиться к тому, что вы хотите.Затем вы можете использовать agent.PostAndAsyncReply с таймаутом для получения текущего AgentState.Как упоминалось выше, вам нужно сделать объекты, которые вы передаете, сериализуемыми, но даже делегаты сериализуемы.Внутренние компоненты действительно не связаны с async вычислениями.Вычисление async просто позволит вам взаимодействовать с различными агентами в вашей программе неблокирующим образом.

Дейв Томас , и я работаю над библиотекой под названием fracture-io , который предоставит несколько готовых сценариев для работы с агентами.Мы еще не обсуждали этот точный сценарий, но мы могли бы, вероятно, взглянуть на то, как это сделать ... или взять коммит.:)

Я также заметил, что вы отметили свой вопрос callcc.Я отправил образец этого оператора на fssnip , но Томас Петричек быстро опубликовал пример того, как легко сломать вычисления async.Поэтому я не думаю, что callcc является полезным решением для этого вопроса.Если вам не нужен async, вы можете посмотреть в FSharpx для модуля Continuation и оператора callcc.

0 голосов
/ 27 июля 2011

Вы смотрели на Windows Workflow Foundation?

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

Это, вероятно, та технология, которую вы хотите, предполагая, что события / сообщения поступают в течение нескольких часов / дней / недель, и вы сериализуетесь на диск, чтобы избежать использования памяти / потоков тем временем. (Или еще зачем тебе это?)

...