//----------------------------------------------------------------------------------
        // This is the actual work ...
        //----------------------------------------------------------------------------------
        private void bgwProgress_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            SetText("Start work");
            string testHostPort = "";
            string testTopic = "";
            int totalItems = 0;
            int itemsDone = 0;

            this.txtHostPort.Dispatcher.Invoke(new Action(() => { testHostPort = txtHostPort.Text; }));
            this.txtTopic.Dispatcher.Invoke(new Action(() => { testTopic = txtTopic.Text; }));

            totalItems = sonicTestGroup.TestCollection.Count;

            try
            {
                foreach (SonicTest st in sonicTestGroup.TestCollection)
                {
                    SetText("Testing: " + st.testName);
                    if (worker.CancellationPending == true || cancelTestRun)
                    {
                        e.Cancel = true;
                        break;
                    }
                    else
                    {
                        // Report progress...
                        itemsDone++;
                        System.Threading.Thread.Sleep(500);
                        (sender as BackgroundWorker).ReportProgress(((itemsDone / totalItems) * 100), null);
                        SetText("Progress: " + (itemsDone).ToString() + " out of " + (totalItems).ToString());
                    }

                    //-------------- Build the Sonic Message Request Doc ------------------
                    //System.IO.File.WriteAllText(st.testName + ".xml", st.testXML);
                    XmlDocument doc = buildSonicMessage(st.testXML);

                    //------------  Request Doc is built -- Now Send on Sonic -----------------------
                    MessageSender sonicSender = new MessageSender(testHostPort, testTopic);
                    XmlDocument response = MessageSender.createDocument();
                    response = sonicSender.send(doc);
                    //------------ Response Received -- Now Process the Response -------------------
                    SonicTestResult str = new SonicTestResult();
                    str.TestTime = DateTime.Now.ToString();
                    str.TestName = st.testName;
                    str.TestResult = response.InnerXml;

                    sr.resultCollection.Add(str);

                    // - TODO: Get the UI thread to update the TreeView ...
                    SetResultTree(str);
                    //TreeViewItem tvi = new TreeViewItem();
                    //tvi.Header = str.TestName;
                    //TreeViewItem tv2 = new TreeViewItem();
                    //tv2.Header = str.TestResult;
                    //tvi.Items.Add(tv2);

                    //this.treeResults.Dispatcher.Invoke(new Action(() => { treeResults.Items.Add(tvi); }));
                    //treeResults.Items.Add(tvi);

                    //txtResponse.Text = response.InnerXml;

                    //XmlTextWriter writer = new XmlTextWriter(Console.Out);
                    //writer.Formatting = Formatting.Indented;
                    //response.WriteTo(writer);
                    //writer.Flush();
                    //Console.WriteLine();
                    //Console.ReadLine();

                }
            }
            catch (Exception ex)
            {
                SetText(ex.ToString());
            }
            cancelTestRun = false;
            this.btnRunTest.Dispatcher.Invoke(new Action(() => { btnRunTest.IsEnabled = true; }));
            this.btnCancelTestRun.Dispatcher.Invoke(new Action(() => { btnCancelTestRun.IsEnabled = false; }));
        }
 private void SetResultTree(SonicTestResult str)
 {
     this.Dispatcher.Invoke(new System.Action(() => { TreeViewItem tvi = new TreeViewItem();
     tvi.Header = str.TestName;
     TreeViewItem tv2 = new TreeViewItem();
     tv2.Header = str.TestResult;
     tvi.Items.Add(tv2);
     treeResults.Items.Add(tvi);
     }));
 }