internal IEnumerable <TObject> SerialStreamObjectsInternal <TObject, TParam>(StreamManager <TObject, TParam> manager) where TParam : PageableParameters, IXmlParameters { Debug.WriteLine("Streaming objects serially"); if (manager.DirectCall) { prtgClient.Log("Preparing to serially stream objects", LogLevel.Trace); } manager.InitializeRequest(); do { var response = manager.GetObjects(); manager.UpdateTotals(response.Item2); if (manager.StreamEnded(response.Item1)) { prtgClient.Log($"No records were returned. Stream ended at request for record {manager.RequestIndex}/{manager.EndIndex}", LogLevel.Trace); break; } foreach (var obj in response.Item1) { yield return(obj); } manager.UpdateRequestIndex(); } while (manager.RequestIndex < manager.EndIndex); }
internal IEnumerable <TObject> StreamObjects <TObject, TParam>(TParam parameters, bool serial, Func <int> getCount, Func <TParam, Task <List <TObject> > > getObjectsAsync = null, Func <TParam, Tuple <List <TObject>, int> > getObjects = null, bool deserializeAll = true) where TParam : PageableParameters, IShallowCloneable <TParam>, IXmlParameters { prtgClient.Log("Preparing to stream objects", LogLevel.Trace); prtgClient.Log("Requesting total number of objects", LogLevel.Trace); var manager = new StreamManager <TObject, TParam>( this, //Object Engine parameters, //Parameters getCount, //Get Count serial, //Serial false, //Direct Call getObjects, //Get Objects, getObjectsAsync, //Get Objects Async deserializeAll //Deserialize All ); if (manager.TotalToRetrieve > SerialStreamThreshold || serial) { if (manager.TotalToRetrieve > SerialStreamThreshold) { prtgClient.Log($"Switching to serial stream mode as over {SerialStreamThreshold} objects were detected", LogLevel.Trace); } return(SerialStreamObjectsInternal(manager)); } return(StreamObjectsInternal(manager)); }
internal IEnumerable <TObject> StreamObjectsInternal <TObject, TParam>(StreamManager <TObject, TParam> manager) where TParam : PageableParameters, IXmlParameters { Debug.WriteLine("Streaming objects in parallel"); if (manager.DirectCall) { prtgClient.Log("Preparing to stream objects", LogLevel.Trace); } var tasks = new List <Task <List <TObject> > >(); manager.InitializeRequest(); for (; manager.RequestIndex < manager.EndIndex;) { tasks.Add(manager.GetObjectsAsync()); manager.UpdateRequestIndex(); } var result = new ParallelObjectGenerator <List <TObject> >(tasks.WhenAnyForAll()).SelectMany(m => m); return(result); }
internal IEnumerable <TObject> StreamObjects <TObject, TParam>(TParam parameters, bool serial, Func <int> getCount, Func <TParam, Task <List <TObject> > > getObjectsAsync = null, Func <TParam, Tuple <List <TObject>, int> > getObjects = null, bool validateValueTypes = true) where TParam : PageableParameters, IShallowCloneable <TParam>, IXmlParameters { if (parameters == null) { throw new ArgumentNullException(nameof(parameters), "Parameters cannot be null."); } prtgClient.Log("Preparing to stream objects", LogLevel.Trace); prtgClient.Log("Requesting total number of objects", LogLevel.Trace); var manager = new StreamManager <TObject, TParam>( this, //Object Engine parameters, //Parameters getCount, //Get Count serial, //Serial false, //Direct Call getObjects, //Get Objects, getObjectsAsync, //Get Objects Async validateValueTypes //Validate Value Types ); if (manager.TotalToRetrieve > SerialStreamThreshold || serial) { if (manager.TotalToRetrieve > SerialStreamThreshold) { prtgClient.Log($"Switching to serial stream mode as over {SerialStreamThreshold} objects were detected", LogLevel.Trace); } return(SerialStreamObjectsInternal(manager)); } return(StreamObjectsInternal(manager)); }