private MessageService()
        {
            //try
            //{
                //load configuration
                ParseConfig();

                //check failed messages on start
                FileInfo fi = new FileInfo(_filepath);
                if (fi.Exists)
                    _hasFailures = true;

                _activeHost = FindHost();
                //set timer for periodic connectivity check
                TimerCallback tcb = new TimerCallback(TimerElapsed);
                Timer timer = new Timer(tcb, null, _checktime, _checktime);
            //}
            //catch
            //{
                //intentionally left blank to not have the Windows Unhandled Exception box
            //}
        }
        private void ParseConfig()
        {
            //load configuration file
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("configuration.xml");

            //parse elements
            XmlElement root = xmlDoc.DocumentElement;
            foreach (XmlElement element in root.ChildNodes)
            {
                if (element.Name == "hosts")
                {
                    foreach (XmlElement subElement in element.ChildNodes)
                    {
                        if (subElement.Name == "host")
                        {
                            if (subElement.ChildNodes.Count == 2)
                            {
                                XmlNode IP = subElement.ChildNodes[0];
                                XmlNode port = subElement.ChildNodes[1];
                                Host myHost = new Host(IP.InnerText, int.Parse(port.InnerText));
                                _hosts.Add(myHost);
                            }
                        }
                    }
                }
                if (element.Name == "backupFile")
                {
                    _filepath = element.InnerText;
                }
                if (element.Name == "logPath")
                {
                    _logpath = ((element.InnerText.EndsWith(@"\") ? element.InnerText.Substring(0, element.InnerText.Length - 1) : element.InnerText) + @"\" + DateTime.Today.ToString("yyyyMMdd") + ".log");
                }
                if (element.Name == "interval")
                {
                    _checktime = long.Parse(element.InnerText);
                }
            }
            //log application startup
            string message = string.Format("{0}{1} - Application started{0}", Environment.NewLine, DateTime.Now.ToString("HH:mm:ss.ffffff"));
            File.AppendAllText(_logpath, message, Encoding.UTF8);
        }
 //timer callback
 private void TimerElapsed(object info)
 {
     _activeHost = FindHost();
 }
        void OnDoWork(object sender, DoWorkEventArgs e)
        {
            while (_messages.Count > 0)
            {
                TcpClient client = new TcpClient();
                try
                {
                    client.Connect(IPAddress.Parse(_activeHost.IP), _activeHost.Port);

                    string message = _messages.Dequeue();

                    byte[] buffer = Encoding.Unicode.GetBytes(message);

                    client.Client.Send(buffer);

                    Log(new MessageEventArgs(message, _messages.Count, MessageStatus.Success, null));
                }
                catch (SocketException ex)
                {
                    _hasFailures = true;
                    string[] messages = _messages.ToArray();
                    Log(new MessageEventArgs(null, _messages.Count, MessageStatus.Failure, ex.Message));

                    _messages.Clear();
                    //save array to file
                    StringBuilder allMessages = new StringBuilder();
                    foreach (string message in messages)
                    {
                        allMessages.Append(message + Environment.NewLine);
                    }
                    File.AppendAllText(_filepath, allMessages.ToString(), Encoding.UTF8);
                    //failover
                    _activeHost = FindHost();
                }
                finally
                {
                    if (client.Connected)
                    {
                        client.Client.Shutdown(SocketShutdown.Both);
                        client.Client.Disconnect(false);
                    }
                }
            }
            _backgroundWorker = null;
        }