//private static volatile bool NuoveRichieste = false;

        private static void QueryRichieste()
        {
            for (int i = ElencoNuoveRichieste.Count - 1; i >= 0; i--)
            {
                RichiestaCalendario richiestaCalendario = ElencoNuoveRichieste[i];

                ElencoNuoveRichieste.RemoveAt(i);
                ElencoRichiesteAttive.Add(richiestaCalendario);

                prevent.calendar.Parametri parametri = new prevent.calendar.Parametri();

                parametri.DataInizio = richiestaCalendario.DataInizio;
                parametri.DataFine   = richiestaCalendario.DataFine;
                parametri.TipoGS     = richiestaCalendario.TipoRichiesta;
                parametri.IdSito     = new string[1];
                parametri.IdSito[0]  = richiestaCalendario.Ingresso.ToString();

                richiestaCalendario.ParametriXml = parametri;

                // attivo un thread che effettua la chiamata al web service
                ParameterizedThreadStart newThreadStart = new ParameterizedThreadStart(TaskAsincrono);
                Thread nuovo = new Thread(newThreadStart);
                nuovo.Start(richiestaCalendario);

                if (i > 0)
                {
                    Thread.Sleep(300);
                }
            }
        }
        private static void AccodaRichiesta(DateTime inizio, int ingresso)
        {
            lock (SyncRoot)
            {
                bool found = false;
                foreach (RichiestaCalendario richiestaCalendario in ElencoNuoveRichieste)
                {
                    if (richiestaCalendario.Ingresso == ingresso)
                    {
                        if (richiestaCalendario.Espandi(inizio, inizio))
                        {
                            //Console.WriteLine("Espando una richiesta {0} - {1}", richiestaCalendario.DataInizio, richiestaCalendario.DataFine);
                            found = true;
                            break;
                        }
                    }
                }
                if (!found)
                {
                    foreach (RichiestaCalendario richiestaCalendario in ElencoRichiesteEvase)
                    {
                        // richiesta già fatta ...
                        if (richiestaCalendario.Ingresso == ingresso && richiestaCalendario.DataFine >= inizio && richiestaCalendario.DataInizio <= inizio)
                        {
                            found = true;
                        }
                    }

                    if (!found)
                    {
                        foreach (RichiestaCalendario richiestaCalendario in ElencoRichiesteAttive)
                        {
                            if (richiestaCalendario.Ingresso == ingresso && richiestaCalendario.DataFine >= inizio && richiestaCalendario.DataInizio <= inizio)
                            {
                                found = true;
                            }
                        }

                        if (!found)
                        {
                            Console.WriteLine("Genero nuova richiesta {0}", inizio.Date);

                            RichiestaCalendario nuova = new RichiestaCalendario();
                            nuova.Ingresso   = ingresso;
                            nuova.DataInizio = inizio.Date;
                            nuova.DataFine   = inizio.Date.AddDays(1);
                            //nuova.NuovaRichiesta = true;
                            nuova.Risposta      = false;
                            nuova.TipoRichiesta = TipoGS;

                            ElencoNuoveRichieste.Add(nuova);
                        }
                    }
                    //NuoveRichieste = true;
                }
            }
        }
        private static void TaskAsincrono(object data)
        {
            RichiestaCalendario item = (RichiestaCalendario)data;

            try
            {
                Console.WriteLine("RICHIESTA: INIZIO: " + item.DataInizio);
                Console.WriteLine("RICHIESTA: FINE: " + item.DataFine);

                string richiesta = GetXmlRichiesta(item.ParametriXml);
                Console.WriteLine(richiesta);

                DateTime start = DateTime.Now;
                PreventWebServices.WebReferencePrevent.WSPreventService wsp = new PreventWebServices.WebReferencePrevent.WSPreventService();
                string risposta = wsp.calendar("WinTicket", WsConfig.Username, WsConfig.Password, richiesta);

                DateTime end = DateTime.Now;
                Console.WriteLine("START: " + start.ToLongTimeString());
                Console.WriteLine("END: " + end.ToLongTimeString());
                Console.WriteLine("DURATA: " + (end - start).TotalMilliseconds);

                //Console.WriteLine(risposta);

                MemoryStream         stream      = new MemoryStream(Encoding.UTF8.GetBytes(risposta));
                XmlSerializer        xml         = new XmlSerializer(typeof(prevent.calendar.Out));
                prevent.calendar.Out outrisposta = (prevent.calendar.Out)xml.Deserialize(stream);

                lock (SyncRoot)
                {
                    //for (int i = 0; i < outrisposta.SitoCalendario.Length; i++)
                    //{
                    //    for (int j = 0; j < outrisposta.SitoCalendario[i].Giornata.Length; j++)
                    //    {
                    //        for (int p = 0; p < outrisposta.SitoCalendario[i].Giornata[j].Periodo.Length; p++)
                    //        {
                    //            if (outrisposta.SitoCalendario[i].Giornata[j].Data.Day == 15)
                    //                Console.WriteLine("Disp: {0:d} {1}: {2}",
                    //                    outrisposta.SitoCalendario[i].Giornata[j].Data,
                    //                    outrisposta.SitoCalendario[i].Giornata[j].Periodo[p].Ora.Replace("00.0000+01:00", ""),
                    //                    outrisposta.SitoCalendario[i].Giornata[j].Periodo[p].Max);
                    //        }
                    //    }
                    //}

                    foreach (prevent.calendar.OutSitoCalendario outSitoCalendario in outrisposta.SitoCalendario)
                    {
                        int sito = int.Parse(outSitoCalendario.IdSito);
                        if (outSitoCalendario.Giornata == null)
                        {
                            continue;
                        }

                        foreach (prevent.calendar.OutSitoCalendarioGiornata outSitoCalendarioGiornata in outSitoCalendario.Giornata)
                        {
                            if (outSitoCalendarioGiornata.Periodo == null)
                            {
                                continue;
                            }

                            RisultatoCalendario infog = new RisultatoCalendario();
                            infog.Ingresso            = sito;
                            infog.InfoGiornata        = outSitoCalendarioGiornata.Note;
                            infog.PostiDisponibili    = 0;
                            infog.MaxPostiDisponibili = 0;
                            infog.DataOra             = outSitoCalendarioGiornata.Data;

                            AggiornaEdInserisci(infog);

                            foreach (prevent.calendar.OutSitoCalendarioGiornataPeriodo outSitoCalendarioGiornataPeriodo in outSitoCalendarioGiornata.Periodo)
                            {
                                RisultatoCalendario risultato = new RisultatoCalendario();
                                risultato.Ingresso            = sito;
                                risultato.InfoGiornata        = outSitoCalendarioGiornata.Note;
                                risultato.PostiDisponibili    = int.Parse(outSitoCalendarioGiornataPeriodo.Disponibili);
                                risultato.MaxPostiDisponibili = int.Parse(outSitoCalendarioGiornataPeriodo.Max);
                                risultato.DataOra             = outSitoCalendarioGiornata.Data;

                                string ora    = outSitoCalendarioGiornataPeriodo.Ora.Substring(0, 2);
                                string minuti = outSitoCalendarioGiornataPeriodo.Ora.Substring(3, 2);
                                risultato.DataOra = risultato.DataOra.AddMinutes(int.Parse(minuti));
                                risultato.DataOra = risultato.DataOra.AddHours(int.Parse(ora));

                                AggiornaEdInserisci(risultato);
                            }
                        }
                    }

                    ElencoRichiesteAttive.Remove(item);
                    ElencoRichiesteEvase.Add(item);

                    NewData = true;
                }
            }
            catch (Exception ex)
            {
                // eseguo di nuovo se ho avuto dei problemi...
                //item.NuovaRichiesta = true;

                Console.Write(ex.Message);

                lock (SyncRoot)
                {
                    ErroriWeb.Add(ex);

                    item.TimeToLive++;
                    ElencoRichiesteAttive.Remove(item);
                    if (item.TimeToLive < 4)
                    {
                        ElencoNuoveRichieste.Add(item);
                    }
                    else
                    {
                        // log errore Prevent
                    }
                }
            }
        }