2013-06-11 5 views
6

कनवर्ट करें मैं कार्य पूर्ण करने के रूप में कार्य की गणना को बफर करने के लिए प्रतिक्रियाशील एक्सटेंशन (आरएक्स) का उपयोग करने की कोशिश कर रहा हूं। क्या किसी को पता है कि ऐसा करने का एक साफ अंतर्निहित तरीका है? ToObservable विस्तार विधि केवल IObservable<Task<T>> बनायेगी, जो कि मैं नहीं चाहता हूं, मुझे IObservable<T> चाहिए, ताकि मैं Buffer पर उपयोग कर सकूं।Inumerable <Task<T>> IObservable <T>

काल्पनिक उदाहरण:

//Method designed to be awaitable 
public static Task<int> makeInt() 
{ 
    return Task.Run(() => 5); 
} 

//In practice, however, I don't want to await each individual task 
//I want to await chunks of them at a time, which *should* be easy with Observable.Buffer 
public static void Main() 
{ 
    //Make a bunch of tasks 
    IEnumerable<Task<int>> futureInts = Enumerable.Range(1, 100).Select(t => makeInt()); 

    //Is there a built in way to turn this into an Observable that I can then buffer? 
    IObservable<int> buffered = futureInts.TasksToObservable().Buffer(15); //???? 

    buffered.Subscribe(ints => { 
     Console.WriteLine(ints.Count()); //Should be 15 
    }); 
} 
+0

http://stackoverflow.com/questions/13500456/how-to-convert-an-ienumerabletaskt-to-iobservablet –

उत्तर

7

आप तथ्य यह है कि Task नमूदार का उपयोग कर another overload of ToObservable() में बदला जा सकता का उपयोग कर सकते हैं।

जब आपके पास (एकल-आइटम) अवलोकनों का संग्रह होता है, तो आप एक एकल अवलोकन कर सकते हैं जिसमें Merge() का उपयोग करके आइटम शामिल होते हैं।

तो, अपने कोड ऐसा दिखाई दे सकता:

futureInts.Select(t => t.ToObservable()) 
      .Merge() 
      .Buffer(15) 
      .Subscribe(ints => Console.WriteLine(ints.Count)); 
संबंधित मुद्दे