예제 #1
0
        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);
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
        }