Вопросы (3 из них связанных) выделены жирным шрифтом ниже.
Я пытаюсь создать класс F # - мне нужно использовать его, не ссылаясь на сборку F # из C #.
У меня есть такой код:
type ReceiverExceptionEventArgs(ex:Exception) =
inherit EventArgs()
member this.Exception = ex
type ExceptionRaised = delegate of obj * ReceiverExceptionEventArgs -> unit
type Receiver( ... ) =
let error = new Event<ExceptionRaised, ReceiverExceptionEventArgs>()
let a = new Actor<...>(fun inbox -> ...)
[<CLIEvent>]
member __.Error = error.Publish
/// Starts the receiver which starts the consuming from the service bus
/// and creates the queue if it doesn't exist
member x.Start () =
logger.InfoFormat("start called for queue '{0}'", desc)
a.Post Start
Я хотел бы добавить это после let a = new Actor...
:
do a.Error.Add(fun ex -> error.Trigger(this, new ReceiverExceptionEventArgs(ex)))
Но я нев вышеприведенной строке нет ссылки на 'this' ... Как бы я сделал это идиоматически в F #?
Как еще одно осложнение, актер начинает числоасинхронных вычислений, которые в основном являются циклами;эти вычисления возвращают единицу, поэтому я не могу просто сделать:
let startPairsAsync pairs token =
async {
for Pair(mf, rs) in pairs do
for r in rs do
match Async.Start(Async.Catch(r |> worker), token) with
| Choice1Of2 () -> ()
| Choice2Of2 ex -> error.Trigger(null, new ReceiverExceptionEventArgs(ex)) }
, потому что worker r
равно Async<unit>
, поэтому Я получаю This expression was expected to have type 'unit' but was here 'Choice1of2<'a, 'b>'
при первом совпадении с образцом.
Отступление:
Является ли идея, что я создаю актеров также для каждого работника?Я хотел бы иметь код, который похож на то, как erlang делает «супервизоры», потому что то, с чем я работаю, может произойти сбой произвольно почти в любой точке (сети) ... Супервизоры выходят за рамки этого вопроса;но получу ли я лучшую обработку идиоматических исключений с Mutliple Actors, а не с Async.Catch?