protected virtual void runThread()
 {
     try {
         while (true)
         {
             while (this.webService.testConnection())
             {
                 // we got some connection
                 // make a dictionary which we later send in msgpack
                 var payLoad = new WebServicePayLoad();
                 payLoad.version = this.protocolversion;
                 payLoad.id      = Guid.NewGuid().ToString();
                 // logs will be dictionaries stored in an array
                 payLoad.logs = new List <Dictionary <string, string> >();
                 // get logs from the queue and send them
                 using (var session = queue.OpenSession()) {
                     try {
                         int i = 0;
                         while (i < this.logsPerBatch)
                         {
                             var pack = session.Dequeue();
                             // if task is null then queue is empty so we just submit
                             if (pack == null)
                             {
                                 break;
                             }
                             // unpack to dictionary and add to array
                             var eventPayload = this.logEventSerializer.UnpackSingleObject(pack);
                             payLoad.logs.Add(eventPayload);
                             i++;
                         }
                         // if we havn't got any logs after this the queue is empty and we break the connection loop (to wait the long time)
                         if (payLoad.logs.Count == 0)
                         {
                             break;
                         }
                         var dataToSend = this.logBatchSerializer.PackSingleObject(payLoad);
                         var resp       = this.webService.sendData(dataToSend, payLoad.id);
                         if (resp)
                         {
                             // everything went well so we acknowledge the stuff we picked from the queue
                             session.Flush();
                         }
                         else
                         {
                             // break the loop on error
                             InternalLogger.Error("get unexpected response {0} from log server", resp);
                             break;
                         }
                     } catch (Exception ex) {
                         InternalLogger.Error("error in messagepack target when creating batch {0} {1} {2}", ex.Message, ex.StackTrace, ex.ToString());
                         break;
                     }
                 }
                 // we submitted a batch and now sleep before the next one
                 Thread.Sleep(this.waitBetweenBatch);
             }
             // connect failed wait some time before trying again
             Thread.Sleep(this.waitBetweenConnections);
         }
     }
     catch (ThreadInterruptedException) {
         this.queue.Dispose();
     }
     catch (Exception ex)
     {
         InternalLogger.Error("Something failed in MsgPackTarget background thread {0} {1} {2}", ex.Message, ex.ToString(), ex.StackTrace);
     }
 }
        protected virtual void runThread()
        {
            try {
                while (true) {
                    while (this.webService.testConnection()) {
                        // we got some connection
                        // make a dictionary which we later send in msgpack
                        var payLoad = new WebServicePayLoad();
                        payLoad.version = this.protocolversion;
                        payLoad.id = Guid.NewGuid().ToString();
                        // logs will be dictionaries stored in an array
                        payLoad.logs = new List<Dictionary<string,string>>();
                        // get logs from the queue and send them
                        using (var session = queue.OpenSession()) {
                            try {
                                int i = 0;
                                while (i<this.logsPerBatch) {
                                    var pack = session.Dequeue();
                                    // if task is null then queue is empty so we just submit
                                    if (pack == null) {
                                        break;
                                    }
                                    // unpack to dictionary and add to array
                                    var eventPayload = this.logEventSerializer.UnpackSingleObject(pack);
                                    payLoad.logs.Add(eventPayload);
                                    i++;
                                }
                                // if we havn't got any logs after this the queue is empty and we break the connection loop (to wait the long time)
                                if (payLoad.logs.Count == 0)
                                {
                                    break;
                                }
                                var dataToSend = this.logBatchSerializer.PackSingleObject(payLoad);
                                var resp = this.webService.sendData(dataToSend,payLoad.id);
                                if (resp) {
                                    // everything went well so we acknowledge the stuff we picked from the queue
                                     session.Flush();
                                }
                                else {
                                    // break the loop on error
                                    InternalLogger.Error("get unexpected response {0} from log server",resp);
                                    break;
                                }

                            } catch (Exception ex) {
                                InternalLogger.Error("error in messagepack target when creating batch {0} {1} {2}",ex.Message,ex.StackTrace,ex.ToString());
                                break;
                            }

                        }
                        // we submitted a batch and now sleep before the next one
                        Thread.Sleep(this.waitBetweenBatch);
                    }
                    // connect failed wait some time before trying again
                    Thread.Sleep(this.waitBetweenConnections);
                }
            }
            catch (ThreadInterruptedException) {
                this.queue.Dispose();
            }
            catch (Exception ex)
            {
                InternalLogger.Error("Something failed in MsgPackTarget background thread {0} {1} {2}", ex.Message, ex.ToString(), ex.StackTrace);
            }
        }