示例#1
0
        /// <summary>
        /// Loads requested data from associated IDataSource and supplies an object containing data to be used by associated IDataSource
        /// </summary>
        /// <param name="inputParameters">Input parameters for IDataSource</param>
        /// <param name="dataToLoad">List of types of data that should be loaded</param>
        /// <param name="stopAfterFirstException">If true, will stop loading after catching first exception</param>
        /// <param name="callerContext">Object containing data to be used by associated IDataSource</param>
        /// <returns>Requested data, grouped by type</returns>
        public LoadingResult <TData> LoadData(IDictionary <TParam, object> inputParameters, TData[] dataToLoad, bool stopAfterFirstException, object callerContext)
        {
            var startTime = DateTime.Now;

            Debug.WriteLine("Loading {0}", String.Join(", ", dataToLoad));

            var parameters = new Dictionary <TParam, object>(inputParameters);
            var data       = new LoadingResult <TData> {
                Success = true
            };

            foreach (var dataType in dataToLoad)
            {
                var type = dataType;
                ThreadPool.QueueUserWorkItem(state => LoadData(type, parameters, data, state), callerContext);
            }

            lock (data)
            {
                while ((!stopAfterFirstException || (stopAfterFirstException && data.Success)) && (data.Count < dataToLoad.Length))
                {
                    Monitor.Wait(data);
                }
            }

            Debug.WriteLine("Loading finished in {0}", DateTime.Now - startTime);
            return(data);
        }
示例#2
0
        private void LoadData(TData data, IDictionary <TParam, object> parameters, LoadingResult <TData> dataContainer, object callerContext)
        {
            var startTime = DateTime.Now;

            Debug.WriteLine("Will load {0}", data);

            var inputParameters = GetInputParameters(data);
            var parameterValues = new Dictionary <TParam, object>();

            lock (parameters)
            {
                bool allParametersExist;

                do
                {
                    allParametersExist = true;
                    parameterValues.Clear();

                    foreach (var paramType in inputParameters)
                    {
                        if (parameterValues.ContainsKey(paramType))
                        {
                            continue;
                        }

                        object paramVal;
                        if (parameters.TryGetValue(paramType, out paramVal))
                        {
                            parameterValues.Add(paramType, paramVal);
                        }
                        else
                        {
                            Debug.WriteLine("[{0}] Required parameter {1} does not exist", data, paramType);
                            allParametersExist = false;
                        }
                    }

                    if (!allParametersExist)
                    {
                        Monitor.Wait(parameters);
                    }
                } while (!allParametersExist);
            }

            Debug.WriteLine("[{0}] All required parameters do exist", data);

            foreach (var paramType in GetOptionalParameters(data))
            {
                if (parameterValues.ContainsKey(paramType))
                {
                    continue;
                }

                object paramVal;
                if (parameters.TryGetValue(paramType, out paramVal))
                {
                    Debug.WriteLine("[{0}] Optional parameter {1} is supplied", data, paramType);
                    parameterValues.Add(paramType, paramVal);
                }
            }

            object dataValue = null;

            try
            {
                dataValue = _dataSource.LoadData(data, parameterValues, new LoadingContext <TParam>(parameters)
                {
                    State = callerContext
                });

                lock (dataContainer)
                {
                    dataContainer.AddData(data, dataValue);
                    Monitor.Pulse(dataContainer);
                }
            }
            catch (Exception ex)
            {
                lock (dataContainer)
                {
                    dataContainer.AddData(data, null);
                    dataContainer.Success = false;
                    dataContainer.AddException(ex);
                    Monitor.Pulse(dataContainer);
                }
            }

            Debug.WriteLine("[{0}] Loading finished in {1}", data, DateTime.Now - startTime);
        }