Il existe un MailboxProcessor en F # ... J'utiliserais un SynchronizationContext en C# dans le même but. Donnez-moi quelques minutes et je vais écrire un exemple. A côté: Voici mon code en F # qui fait quelque chose de similaire ... Ce sera beaucoup plus d'effort, mais encore faisable en C# avec Rx.
open System.Diagnostics
let numWorkers = 20
let asyncDelay = 100
type MessageForMailbox =
| DataMessage of AsyncReplyChannel<unit>
| GetSummary of AsyncReplyChannel<unit>
let main =
let actor =
MailboxProcessor.Start(fun inbox ->
let rec loop acc =
async {
let! message = inbox.Receive()
match message with
| DataMessage replyChannel -> replyChannel.Reply(); return! loop acc
| GetSummary replyChannel -> replyChannel.Reply(); return! loop acc
}
loop 0 // seed for acc
)
let codeBlocks = [for i in 1..numWorkers ->
async {
do! Async.Sleep asyncDelay
return! actor.PostAndAsyncReply DataMessage
} ]
while true do
printfn "Concurrent started..."
let sw = new Stopwatch()
sw.Start()
codeBlocks |> Async.Parallel |> Async.RunSynchronously |> ignore
actor.PostAndReply GetSummary
sw.Stop()
printfn "Concurrent in %d millisec" sw.ElapsedMilliseconds
printfn "efficiency: %d%%" (int64 (asyncDelay * 100)/sw.ElapsedMilliseconds)
printfn "Synchronous started..."
let sw = new Stopwatch()
sw.Start()
for codeBlock in codeBlocks do codeBlock |> Async.RunSynchronously |> ignore
sw.Stop()
printfn "Synchronous in %d millisec" sw.ElapsedMilliseconds
printfn "efficiency: %d%%" (int64 (asyncDelay * numWorkers * 100)/sw.ElapsedMilliseconds)
main
Tous les types des 1000 observables sont-ils identiques? Qu'est-ce que vous tapez de l'agrégation observable à être? –
Tous les 1000 observables sont du même type, le nouvel agrégat peut être un nouveau type. Par exemple. L'événement devient AggregateEvent. – lukebuehler
Voulez-vous combiner leurs dernières valeurs uniquement? C'EST À DIRE. si Observable a déclenche deux événements et que b ne peut en déclencher qu'un, voulez-vous agréger le premier événement d'un événement, ou le dernier événement d'un, avec l'événement b? –