/// <summary>
        /// The synchronous version of the function which gets 
        /// the returned datasets from stored prox at the location specified 
        /// at <see cref="connectionString"/>.
        /// </summary>
        /// <param name="filterOnNamesLike"> A proc(s) search criteria. </param>
        /// <param name="connectionString">
        /// The calling assembly is forced to specify what the connection string is.
        /// This value should bare a semblance to the current connection values at 
        /// <see cref="NfConfig.SqlServer"/> and 
        /// <see cref="NfConfig.SqlCatalog"/>
        /// but its value is not inspected verifying this.  
        /// </param>
        /// <remarks>
        /// The excessive level of indirection here is an attempt to gain control 
        /// over the fact that any stored proc which itself calls 'sp_executesql' does
        /// not honor the timeout value assigned on the <see cref="System.Data.SqlClient.SqlCommand"/>.
        /// Since every proc is invoked with random values, a stored proc
        /// may run endlessly and comsume the entire machines resources. 
        /// Placing all this under the control of an autonomous process allows for the process, as a whole,
        /// to be shutdown, and SqlServer has to clean up the mess.
        /// </remarks>
        public void GetSpResultSetXsd(StoredProxSearchCriteria filterOnNamesLike, string connectionString)
        {
            //blow up for this
            if(!File.Exists(_nfHbmInvokeProxExePath))
                throw new ItsDeadJim(string.Format("The required console app is missing at '{0}'", _nfHbmInvokeProxExePath));

            BroadcastProgress(new ProgressMessage
            {
                Activity = "Loading current connection",
                Status = Status
            });

            Settings.LoadOutputPathCurrentSettings();

            BroadcastProgress(new ProgressMessage
            {
                Activity = "Getting list of stored proc targets",
                Status = Status
            });

            //copy into local copy the global sql inj param names
            if (Settings.SqlInjParamNames.Any())
            {
                filterOnNamesLike = filterOnNamesLike ?? new StoredProxSearchCriteria();
                filterOnNamesLike.SqlInjOnParamNamesLike.AddRange(Settings.SqlInjParamNames);
            }

            //check the current connection has any procs present
            var allStoredProx = GetFilteredStoredProcNames(filterOnNamesLike);
            if (allStoredProx == null || allStoredProx.Count <= 0)
            {
                BroadcastProgress(new ProgressMessage
                {
                    Activity = "There are no prox at NoFuture.Hbm.Sorting.AllStoredProx",
                    Status = Status
                });
                return;
            }

            //begin async listening for messages from autonomous processes
            var socketListeningTask = _taskFactory.StartNew(BeginReceiveMsgFromProcess);

            var counter = 0;

            foreach (var spItemKey in allStoredProx.Keys)
            {
                //check for the name being on the black list
                if (Settings.DoNotReference.Contains(spItemKey))
                {
                    counter += 1;
                    continue;
                }

                //assign to instance level
                _currentSp = allStoredProx[spItemKey];

                //serialize to disk - invoked process will read from this location
                _currentSp.SerializeToDisk();

                //start a P\Invoke to NoFuture.Hbm.InvokeStoredProc.exe
                using (_currentProcess = new Process
                {
                    StartInfo =
                        new ProcessStartInfo(_nfHbmInvokeProxExePath, ConstructCmdLineArgs(_currentSp, connectionString))
                        {
                            CreateNoWindow = true,
                            UseShellExecute = false,
                            RedirectStandardOutput = true,
                            RedirectStandardError = true
                        }
                })
                {
                    BroadcastProgress(new ProgressMessage
                    {
                        Activity = string.Format("At sp '{0}'", _currentSp.ProcName),
                        Status = Status,
                        ProgressCounter = Etc.CalcProgressCounter(counter, allStoredProx.Count),
                        ProcName = _currentSp.ProcName
                    });

                    try
                    {
                        Settings.WriteToStoredProcLog(string.Format("working '{0}'", _currentSp.ProcName));

                        //fire off the exe
                        _currentProcess.Start();

                        //wait for it to finish or timeout
                        _currentProcess.WaitForExit((Settings.HbmStoredProcXsdTimeOut + PInvokePaddingInSeconds) * 1000);

                        //presumes it timed out
                        if (!_currentProcess.HasExited)
                        {
                            //the only sure way to end some p.o.s. proc
                            _currentProcess.Kill();
                            Settings.WriteToStoredProcLog(string.Format("Stored proc '{0}' is not responding is will be shutdown", _currentSp.ProcName));
                            Sorting.KilledProx.Add(_currentSp.ProcName);
                        }
                    }
                    catch (Exception ex)
                    {
                        Settings.WriteToStoredProcLog(ex, string.Format("unknown error at '{0}'", _currentSp.ProcName));
                    }

                    counter += 1;
                }
            }

            //communicate that the has completed
            BroadcastProgress(new ProgressMessage
            {
                Activity = "GetSpResultSetXsd has completed",
                Status = COMPLETED_STATUS_STRING,
                ProgressCounter = 100,
            });

            if(socketListeningTask.IsCompleted)
                socketListeningTask.Dispose();
        }