예제 #1
0
        private void thrAttesaValidazioneEOrdina(ref object oggT)
        {
            (oggT as ISortBindObj).SincroValidazioneRiordino = SincroValidazioneRiordino.RichiamatoRiordino; //Deve stare
            Thr.SbloccaThrPadre();
            (oggT as ISortBindObj).TimeOutValidazionMs = 1000;                                               //Possibilità poi aggiornarlo da validazione
            DateTime oraAtt = DateTime.Now;

            while ((oggT as ISortBindObj).SincroValidazioneRiordino == SincroValidazioneRiordino.RichiamatoRiordino || (oggT as ISortBindObj).SincroValidazioneRiordino == SincroValidazioneRiordino.InValidazione)
            {
                //DataOra.SleepConDoEvents(1);
                Thread.Sleep(1);
                if (DataOra.AttesaTempo(ref oraAtt, (oggT as ISortBindObj).TimeOutValidazionMs) == true)
                {
                    break;
                }
            }
            if ((oggT as ISortBindObj).SincroValidazioneRiordino != SincroValidazioneRiordino.ValidazioneTerminata)
            {
                Log.main.Add(new Mess(LogType.ERR, Log.main.errUserText, "SincroValidazioneRiordino non è ancora ValidazioneTerminata dopo:<" + (oggT as ISortBindObj).TimeOutValidazionMs + "> ms, valore SincroValidazioneRiordino:<" + (oggT as ISortBindObj).SincroValidazioneRiordino.ToString() + ">"));
            }

            if ((oggT as IValidation).IsValid == false)
            {
                return;
            }
            (oggT as ISortBindObj).SincroValidazioneRiordino = SincroValidazioneRiordino.InRiordino;
            Ordina();
            (oggT as ISortBindObj).SincroValidazioneRiordino = SincroValidazioneRiordino.FineRiordino;
        }
예제 #2
0
        private bool ThrEQ_Exec(ref Exception thrEx)
        {
            Thr.SbloccaThrPadre();

            thrEx = null;

            try
            {  //Il Try Catch serve quà poichè essendo un altro thread rispetto al chiamante, il chiamante non può intercettare le eccezioni
                if (@out == QryOut.dataTable)
                {
                    ResDt = new DataTable();
                    ResDt.Load(cmd.ExecuteReader());
                }
                else if (@out == QryOut.dataReader)
                {
                    if (ResOle != null && ResOle.IsClosed == false)
                    {
                        ResOle.Close();                                              //Se si riusa l'oggetto query con 'out' 'dataReader' senza una res specifica, bisogna chiudere l'OleDbDataReader
                    }
                    //resOle = cmd.ExecuteReader() 'Con cmd.ExecuteReader(CommandBehavior.CloseConnection) nel momento in cui su resOle eseguo il metodo.Close() si chiude anche il cmd.connection, meglio toglierlo poichè la connection mi serve aperta
                    ResOle = cmd.ExecuteReader();
                }
                return(true);
            }
            catch (Exception ex)
            {
                thrEx = ex;
                return(false);
            }
        }
예제 #3
0
        private bool ThrENQ_Exec(out Exception thrEx)
        {
            Thr.SbloccaThrPadre();
            thrEx = null;

            try
            { //Il Try Catch serve quà poichè essendo un altro thread rispetto al chiamante, il chiamante non può intercettare le eccezioni
                cmd.ExecuteNonQuery();
                return(true);
            }
            catch (Exception ex)
            {
                thrEx = ex;
                return(false);
            }
        }
예제 #4
0
        private void ThrAvvioUpload(UploadItem elemUpload)
        {
            Thr.SbloccaThrPadre();

            Thread thrDL;

            thrDL = Thr.AvviaNuovo(() => ThrUpload(ref elemUpload));

            if (Thr.AttesaCompletamento(ref thrDL, (elemUpload.TimeoutSec == -1 ? -1 : elemUpload.TimeoutSec * 1000)) == false)
            { //TimeOut
                elemUpload.DescErr     = "Timeout:<" + elemUpload.TimeoutSec + "> secondi, raggiunto";
                elemUpload.UploadState = UplItemState.Timeout;

                Log.main.Add(new Mess(elemUpload.tipoLogTimeout, "", "per l'url:<" + elemUpload.url + ">, " + elemUpload.DescErr));
            }
        }
예제 #5
0
파일: Zip.cs 프로젝트: NickHola/Backupper
        private static bool ThrComprimi(Dictionary <string, string> dizionarioDaCompr, string percNomeFileCompr, TipiArchivio formatoArchivio, CompressionLevels livelloCompr, string passsword, Progressione Progressione)
        {
            Thr.SbloccaThrPadre();
            SevenZipCompressor zipCompressor;

            try {
                zipCompressor = new SevenZipCompressor();

                if (Progressione != null)
                {
                    progressioniAttuali.Add(zipCompressor.UniqueID, Progressione);
                }

                zipCompressor.CompressionMode   = CompressionMode.Create;
                zipCompressor.TempFolderPath    = Path.GetTempPath();
                zipCompressor.ArchiveFormat     = (OutArchiveFormat)(int)formatoArchivio;
                zipCompressor.CompressionMethod = CompressionMethod.Lzma; //ATTENZIONE: la libreria 16.04 con Lzma2 in alcuni casi va in errore
                if (passsword != null)
                {
                    zipCompressor.EncryptHeaders      = true;
                    zipCompressor.ZipEncryptionMethod = ZipEncryptionMethod.Aes256;
                }

                //il formato 7zip se la dll viene eseguita a 32bit non accetta un livello di compressione superiore a Normal
                if (formatoArchivio == TipiArchivio.sevenZip && livelloCompr > CompressionLevels.Normal && Environment.Is64BitProcess == false)
                {
                    livelloCompr = CompressionLevels.Normal;
                }
                zipCompressor.CompressionLevel = (SevenZip.CompressionLevel)(int) livelloCompr;

                zipCompressor.Compressing         += PercentualeCompressa;
                zipCompressor.CompressionFinished += CompressioneTerminata;

                zipCompressor.CompressFileDictionary(dizionarioDaCompr, percNomeFileCompr, passsword);

                return(true);
            } catch (Exception ex) {
                if (Progressione != null)
                {
                    Progressione.ScatenaEventoTerminataConErrori(ex.Message);
                }
                //If progressioniAttuali.ContainsKey(zipCompressor.UniqueID) Then progressioniAttuali(zipCompressor.UniqueID).ScatenaEventoTerminataConErrori(ex.Message)
                return(false);
            }
        }
예제 #6
0
        private bool ThrCDB_Exec()
        {
            Thr.SbloccaThrPadre();
            thrEx = null;

            try
            { //Il Try Catch serve quà poichè essendo un altro thread rispetto al chiamante, il chiamante non può intercettare le eccezioni
                cmd.Connection.Open();
                tra             = cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted);
                cmd.Transaction = tra;
                return(true);
            }
            catch (Exception ex)
            {
                thrEx = ex;
                return(false);
            }
        }
예제 #7
0
파일: Zip.cs 프로젝트: NickHola/Backupper
        private static bool ThrDeComprimi(string percNomeFileZip, string percorsoEstrazione, string passsword, Progressione progressione = null)
        {
            Thr.SbloccaThrPadre();

            SevenZipExtractor zipExtractor;

            try
            {
                if (passsword == null)
                {
                    zipExtractor = new SevenZipExtractor(percNomeFileZip);
                }
                else
                {
                    zipExtractor = new SevenZipExtractor(percNomeFileZip, passsword);
                }


                if (progressione != null)
                {
                    progressioniAttuali.Add(zipExtractor.UniqueID, progressione);
                }

                zipExtractor.Extracting         += PercentualeEstratta;
                zipExtractor.ExtractionFinished += EstrazioneTerminata;

                zipExtractor.ExtractArchive(percorsoEstrazione);

                return(true);
            } catch (Exception ex) {
                if (progressione != null)
                {
                    progressione.ScatenaEventoTerminataConErrori(ex.Message);
                }
                //If progressioniAttuali.ContainsKey(zipExtractor.UniqueID) Then progressioniAttuali(zipExtractor.UniqueID).ScatenaEventoTerminataConErrori(ex.Message)
                return(false);
            }
        }
예제 #8
0
        private void ThrAvvioDownLoad(UInt64 itemKey)
        {
            Thr.SbloccaThrPadre();

            Thread thrDL;

            thrDL = Thr.AvviaNuovo(() => ThrDownload(itemKey));

            DownloadItem elemDownload = null;

            if (Concur.Dictionary_TryGet(this.queue, itemKey, ref elemDownload, out _) == false)
            {
                return;
            }

            if (Thr.AttesaCompletamento(ref thrDL, elemDownload.TimeoutSec == -1 ? -1 : elemDownload.TimeoutSec * 1000) == false)
            { //TimeOut
                elemDownload.DescErr       = "Timeout:<" + elemDownload.TimeoutSec + "> secondi, raggiunto";
                elemDownload.DownloadState = DwlItemState.Timeout;

                Log.main.Add(new Mess(elemDownload.tipoLogTimeout, "", "per l'url:<" + elemDownload.url + ">, " + elemDownload.DescErr));
            }
        }
예제 #9
0
        protected override void ThrCicloReadInputBufferAndElaborateMainQueue()
        {
            Thr.SbloccaThrPadre();

            Thread   thrAvvioUL; Int32 numElemInUpl;
            DateTime timeoutStart; //UInt64 indiceProssElem;
            IOrderedEnumerable <KeyValuePair <UInt64, UploadItem> > elementiDaUpl;

            //indiceProssElem = 1;
#if DEBUG == false
            try
            {
#endif
            while (true)
            {
                Thread.Sleep(9);

                ControlloElementiEStatistiche();

                numElemInUpl = (from tmp in this.queue where tmp.Value.UploadState == UplItemState.UplAvviato select tmp).Count();

                if (numElemInUpl >= this.config.MaxParallelStreams)
                {
                    continue;
                }

                if (this.raggiuntoMaxKBSec)
                {
                    continue;
                }

                elementiDaUpl = from tmp in this.queue where tmp.Value.UploadState == UplItemState.Iniziale orderby tmp.Value.Priority ascending, tmp.Key ascending select tmp; //ho messo il >= indiceProssElem poichè se dovesse succedere che il metodo Accoda salta una chiave,
                                                                                                                                                                                //questo thread non si incanterà, esiste anche il metodo first e firstOrDefault, il primo da eccezione se la query linq non restituisce elementi, nel secondo per il parametro default non si può usare nothing
                if (elementiDaUpl.Count() == 0)
                {
                    continue;
                }

                thrAvvioUL = Thr.AvviaNuovo(() => ThrAvvioUpload(elementiDaUpl.ElementAt(0).Value));

                timeoutStart = DateTime.Now;
                while (true) //Check operation start on item
                {
                    if (elementiDaUpl.ElementAt(0).Value.UploadState != UplItemState.Iniziale)
                    {
                        break;                                                                        //operation started
                    }
                    if ((DateTime.Now - timeoutStart).TotalSeconds > timeoutToStartSec)
                    {
                        elementiDaUpl.ElementAt(0).Value.DescErr = "TimeoutToStart di " + timeoutToStartSec + " secondi raggiunto, url:<" + elementiDaUpl.ElementAt(0).Value.url + ">";
                        Log.main.Add(new Mess(elementiDaUpl.ElementAt(0).Value.tipoLogTimeout, "", "per l'url:<" + elementiDaUpl.ElementAt(0).Value.url + ">, " + elementiDaUpl.ElementAt(0).Value.DescErr));
                        elementiDaUpl.ElementAt(0).Value.UploadState = UplItemState.TimeoutToStart;
                        break;
                    }
                    Thread.Sleep(1);
                }

                //indiceProssElem = elementiDaUpl.ElementAt(0).Key + 1;
            }
#if DEBUG == false
        }

        catch (Exception ex) {
            Thr.NotificaErrThrCiclo(ex, true);
        }
#endif
        }
예제 #10
0
        private void ThrUpload(ref UploadItem elemUpload)
        {
            Thr.SbloccaThrPadre();
            WebClient     client; string suffFileCorrotto; Uri fullUrlIniziale; DateTime tmpAttesa;
            FtpWebRequest ftpWebRequest; FtpWebResponse ftpResponse; FtpStatusCode ftpStatusCode;

            suffFileCorrotto = "";
            client           = new WebClient(); //, flusso As New IO.MemoryStream

            try
            {
                client.UploadDataCompleted   += UploadTerminato;
                client.UploadProgressChanged += PercentualeUpload;

                //client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)") 'Aggiungo lo user agent nell'header nel caso la richiesta contiene una query.

                client.Credentials = DammiCredenziali(ref elemUpload);

                elemUpload.OperationStartDate = DateTime.Now;
                elemUpload.UploadState        = UplItemState.UplAvviato;

                if (elemUpload.UploadType == UploadType.Ftp)
                {
                    if (elemUpload.CorruptFileNameSuffix != "")
                    {
                        suffFileCorrotto = elemUpload.CorruptFileNameSuffix;
                    }
                    else
                    {
                        suffFileCorrotto = config.suffFileCorrotto;
                    }
                }

                fullUrlIniziale = new Uri(Path.Combine(elemUpload.url, elemUpload.FileName) + suffFileCorrotto);

                client.UploadDataAsync(fullUrlIniziale, null, elemUpload.Data, elemUpload);
                //client.UploadData(fullUrl, elemUpload.dati)  'Non scatena glie eventi UploadProgressChanged e UploadDataCompleted

                //AttesaBoolean(client.IsBusy, -1) 'Per le proprità(come IsBusy) se cambia di valore sembra che non lo sente quindi non posso utilizzare AttesaBoolean
                while (client.IsBusy)
                {
                    Thread.Sleep(1);
                }

                tmpAttesa = DateTime.Now;

                while (elemUpload.UploadState == UplItemState.UplAvviato)
                {
                    if (DataOra.AttesaTempo(ref tmpAttesa, 1000) == true)
                    {
                        Log.main.Add(new Mess(LogType.ERR, Log.main.errUserText, "Da quando client non è Busy, lo statoUpload non si è aggiornato in tempo utile, fullUrlIniziale:<" + fullUrlIniziale.OriginalString + ">", visualMsgBox: false));
                        elemUpload.UploadState = UplItemState.Eccezione;
                        client.Dispose();
                        break;
                    }
                }

                client.Dispose();

                if (elemUpload.UploadType == UploadType.Ftp)
                {
                    ftpWebRequest             = (FtpWebRequest)System.Net.FtpWebRequest.Create(fullUrlIniziale);
                    ftpWebRequest.Credentials = DammiCredenziali(ref elemUpload);
                    ftpWebRequest.Method      = System.Net.WebRequestMethods.Ftp.GetFileSize;
                    //MyFtpWebRequest.RenameTo() = nomeFile

                    ftpResponse = (FtpWebResponse)ftpWebRequest.GetResponse();

                    if (elemUpload.Data.Length != ftpResponse.ContentLength)
                    {
                        Log.main.Add(new Mess(LogType.Warn, Log.main.warnUserText, "Rilevate dimensioni differenti tra dati da inviare e dati inviati, elemUpload.dati.Length:<" + elemUpload.Data.Length + ">, ftpResponse.ContentLength:<" + ftpResponse.ContentLength + ">, fullUrlIniziale:<" + fullUrlIniziale.OriginalString + ">"));
                        ftpResponse.Close();
                        return;
                    }

                    ftpResponse.Close();

                    ftpWebRequest             = (FtpWebRequest)System.Net.FtpWebRequest.Create(fullUrlIniziale);
                    ftpWebRequest.Credentials = DammiCredenziali(ref elemUpload);
                    ftpWebRequest.Method      = System.Net.WebRequestMethods.Ftp.Rename;
                    ftpWebRequest.RenameTo    = elemUpload.FileName;
                    ftpResponse = (FtpWebResponse)ftpWebRequest.GetResponse();

                    ftpStatusCode = ftpResponse.StatusCode;

                    if (ftpStatusCode != FtpStatusCode.FileActionOK)
                    {
                        Log.main.Add(new Mess(LogType.Warn, Log.main.warnUserText, "Non sono riuscito a rinominare il file, fullUrlIniziale:<" + fullUrlIniziale.OriginalString + "> in elemUpload.nomeFile:<" + elemUpload.FileName + ">"));
                        ftpResponse.Close();
                        return;
                    }
                    ftpResponse.Close();
                }
            }
            catch (ThreadAbortException ex)  //Thread interrupted by abort, do nothing
            { var tmp = ex; }
            catch (Exception ex)
            {
                Log.main.Add(new Mess(elemUpload.tipoLogEccezione, "", "Eccezione per l'url:<" + elemUpload.url + ">, ex.mess:<" + ex.Message + ">"));
                elemUpload.DescErr     = ex.Message;
                elemUpload.UploadState = UplItemState.Eccezione;
            }
            finally
            {
                client.CancelAsync();
            }
        }
예제 #11
0
        protected override void ThrCicloReadInputBufferAndElaborateMainQueue()
        {
            Thr.SbloccaThrPadre();
            DateTime timeoutStart;
            //UInt64 indiceProssElem;
            IOrderedEnumerable <KeyValuePair <UInt64, DownloadItem> > elementiDaDwl;
            DownloadItem elemDownload = null;

            //indiceProssElem = 1;

#if DEBUG == false
            try {
#endif
            while (true)
            {
                Thread.Sleep(9);

                while (inputBuffer.Count > 0)
                {
                    if (Concur.Queue_TryDequeue(inputBuffer, ref elemDownload) == false)
                    {
                        break;
                    }
                    idItem += 1;
                    elemDownload.IdItemInList = idItem;
                    Concur.Dictionary_TryAddOrUpdate(queue, new KeyValuePair <UInt64, DownloadItem>(idItem, elemDownload), noUpadate: true);
                }

                ControlloElementiEStatistiche();

                ItemInProcessing = (from tmp in this.queue where tmp.Value.DownloadState == DwlItemState.DwlAvviato select tmp).Count();

                if (ItemInProcessing >= this.config.MaxParallelStreams)
                {
                    continue;
                }

                if (this.raggiuntoMaxKBSec)
                {
                    continue;
                }

                elementiDaDwl = from tmp in this.queue where tmp.Value.DownloadState == DwlItemState.Iniziale orderby tmp.Value.Priority ascending, tmp.Key ascending select tmp; //A parità di priority prendo il più vecchio in coda

                ItemToProcess = elementiDaDwl.Count();

                if (ItemToProcess == 0)
                {
                    continue;
                }

                elemDownload = elementiDaDwl.ElementAt(0).Value; //Serve poichè gli elementi della LinQ si aggiornano all'istante quando un parametro della where o della orderby cambiano

                Thread thrDL = Thr.AvviaNuovo(() => ThrAvvioDownLoad(elementiDaDwl.ElementAt(0).Key));

                timeoutStart = DateTime.Now;

                while (true) //Check operation start on item
                {
                    if (elemDownload.DownloadState != DwlItemState.Iniziale)
                    {
                        break;                                                      //operation started
                    }
                    if ((DateTime.Now - timeoutStart).TotalSeconds > timeoutToStartSec)
                    {
                        elemDownload.DescErr = "TimeoutToStart di " + timeoutToStartSec + " secondi raggiunto, url:<" + elemDownload.url + ">";
                        Log.main.Add(new Mess(elemDownload.tipoLogTimeout, "", "per l'url:<" + elemDownload.url + ">, " + elemDownload.DescErr));
                        elemDownload.DownloadState = DwlItemState.TimeoutToStart;
                        break;
                    }
                    Thread.Sleep(1);
                }

                Thread.Sleep(config.SleepAfterOneOperationMs);

                //while (elemDownload.DownloadState == DwlItemState.DwlAvviato)
                //{
                //    Thread.Sleep(1);
                //}
                //indiceProssElem = elementiDaDwl.ElementAt(0).Key + 1;
            }
#if DEBUG == false
        }

        catch (Exception ex) {
            Thr.NotificaErrThrCiclo(ex, true);
        }
#endif
        }
예제 #12
0
        private void ThrDownload(UInt64 itemKey)
        {
            Thr.SbloccaThrPadre();
            DateTime  tmpAttesa;
            WebClient client = new WebClient();

            //client = new WebClient(); //TODO decommentare //, flusso As New IO.MemoryStream
            DownloadItem elemDownload = null;

            try
            {
                if (Concur.Dictionary_TryGet(this.queue, itemKey, ref elemDownload, out _) == false)
                {
                    return;
                }

                client.DownloadDataCompleted   += DownloadTerminato;
                client.DownloadProgressChanged += PercentualeDownload;

                client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); //Aggiungo lo user agent nell'header nel caso la richiesta contiene una query.
                elemDownload.OperationStartDate = DateTime.Now;
                elemDownload.DownloadState      = DwlItemState.DwlAvviato;

                client.DownloadDataAsync(new Uri(elemDownload.url), elemDownload);
                //client.DownloadData() //Non scatena gli eventi DownloadProgressChanged e DownloadDataCompleted

                //AttesaBoolean(client.IsBusy, -1) //Per le proprità(come IsBusy) se cambia di valore sembra che non lo sente quindi non posso utilizzare AttesaBoolean
                while (client.IsBusy)
                {
                    Thread.Sleep(1);
                }

                tmpAttesa = DateTime.Now;

                while (elemDownload.DownloadState == DwlItemState.DwlAvviato)
                {
                    if (DataOra.AttesaTempo(ref tmpAttesa, 1000) == true)
                    {
                        Log.main.Add(new Mess(LogType.ERR, Log.main.errUserText, "Da quando client non è Busy, lo statoDownload non si è aggiornato in tempo utile, elemDownload.url:<" + elemDownload.url + ">", visualMsgBox: false));
                        elemDownload.DownloadState = DwlItemState.Eccezione;
                        break;
                    }
                }

                //client.Dispose();
            }
            catch (ThreadAbortException ex)  //Thread interrupted by abort, do nothing
            { var tmp = ex; }
            catch (Exception ex)
            {
                Log.main.Add(new Mess(elemDownload.tipoLogEccezione, "", "Eccezione per l'url:<" + elemDownload.url + ">, ex.mess:<" + ex.Message + ">"));
                elemDownload.DescErr       = ex.Message;
                elemDownload.DownloadState = DwlItemState.Eccezione;
            }
            finally
            {
                //client.CancelAsync(); //TODO verificare se è la causa dell'errore  sul sito investing

                client.CancelAsync();
                client.Dispose();
            }
        }