/// <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); }
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); }