2010-12-03 31 views
6

में कुल बड़ी संख्या में अवलोकन योग्य हैं, मान लीजिए, एक 1000 अवलोकन योग्य हैं। अब मैं सभी घटनाओं को एक नए अवलोकन में जोड़ना चाहता हूं जो ऑननेक्स्ट को आग लगा देता है जब सभी ने एक घटना भेजी है। आरएक्स का उपयोग करने के लिए सबसे अच्छा तरीका क्या है?नए अवलोकन योग्य

अद्यतन: आरएक्स मंच पर विशेष रूप से डेव सेक्स्टन द्वारा कुछ शानदार प्रतिक्रिया। उन्होंने दिखाया कि एक ज़िप एक्सटेंशन विधि कैसे बनाएं जो कई अवलोकनों को लेती है: http://social.msdn.microsoft.com/Forums/en-US/rx/thread/daaa84db-b560-4eda-871e-e523098db20c/

+0

क्या 1000 प्रकार के सभी प्रकार समान हैं? आप समेकित देखने योग्य प्रकार का क्या प्रकार करते हैं? –

+0

सभी 1000 अवलोकन एक ही प्रकार के हैं, नया कुल एक नया प्रकार हो सकता है। जैसे घटना कुल मिलाकर बन जाती है। – lukebuehler

+0

क्या आप केवल अपने नवीनतम मूल्यों को जोड़ना चाहते हैं? अर्थात। यदि अवलोकन योग्य दो घटनाओं को आग लगती है और अवलोकन योग्य बी केवल एक ही आग लगती है, तो क्या आप बी की घटना के साथ, या अंतिम घटना से पहली घटना को एकत्र करना चाहते हैं? –

उत्तर

2

एफ # में एक मेलबॉक्सप्रोसेसर है ... मैं उसी उद्देश्य के लिए सी # में सिंक्रनाइज़ेशन कॉन्टेक्स्ट का उपयोग करूंगा। मुझे कुछ मिनट दें और मैं एक उदाहरण लिखूंगा।

इसके अलावा: यहां मेरा कोड एफ # में है जो कुछ समान करता है ... यह काफी अधिक प्रयास होगा, लेकिन आरएक्स के साथ सी # में अभी भी करने योग्य होगा।

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 
+0

हम्म, तो आप घटनाओं को बनाने वाले सभी अवलोकनों को सिंक करने के लिए सिंक्रनाइज़ेशन कॉन्टेक्स्ट.एंड() का उपयोग करने के साथ कुछ मतलब है? मैं थोड़े से देखता हूं कि आपका एफ # कोड क्या करता है लेकिन मैं इसे पूरी तरह से समझने के लिए पर्याप्त समझदार नहीं हूं। – lukebuehler

+0

मुझे लगता है कि आपको यह मिला है। Runynynchronously askc वर्कफ़्लोज़ के साथ फोर्कजोइन लागू करता है। – GregC

+0

+1: मैंने कभी मेलबॉक्सप्रोसेसर का अच्छा उदाहरण कभी नहीं देखा है। :) –

संबंधित मुद्दे