public static bool DeComprimi(string percNomeFileZip, string percorsoEstrazione, ref Thread thrZip, string password = null, int timeOutMs = -1, Progressione progressione = null) { if (Zip.inizializzato == false && inizializza() == false) { return(false); } if (FS.ValidaNomeFile(percNomeFileZip, true, CheckExistenceOf.FolderAndFile) == false) { return(false); } if (FS.ValidaPercorsoFile(percorsoEstrazione, true, percFileFormattato: out percorsoEstrazione, verEsistenza: CheckExistenceOf.PathFolderOnly) == false) { return(false); } bool esito = false; Thread thread = Thr.AvviaNuovo(() => esito = ThrDeComprimi(percNomeFileZip, percorsoEstrazione, password, progressione)); if (timeOutMs != 0) //Non attendo il completamento del thr se = 0 { if (Thr.AttesaCompletamento(ref thread, timeOutMs) == false || esito == false) { return(false); } } return(true); }
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); } }
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; }
/// <param name="oggDaCompr">può essere: string (file o cartella), List(Of String) (file o cartella), oggDaComprimere (file o cartella), List(Of oggDaComprimere) (file o cartella)</param> /// <param name="timeOutMs">0 == Non attende la compressione ma ritorna subito | -1 == Attesa infinita | XX == Attesa massima fino a XX ms</param> public static bool Comprimi(object oggDaCompr, string percNomeFileCompr, out Thread thrZip, TipiArchivio formatoArchivio = TipiArchivio.sevenZip, CompressionLevels livelloCompr = CompressionLevels.Ultra, string password = null, int timeOutMs = -1, Progressione progressione = null, Mess logMess = null) { thrZip = null; try { if (logMess == null) { logMess = new Mess(LogType.Warn, Log.main.warnUserText); } if ((Zip.inizializzato == false) && inizializza(logMess) == false) { return(false); } Dictionary <string, string> dizionario; bool esito; if (FS.ValidaPercorsoFile(percNomeFileCompr, true, percFileFormattato: out percNomeFileCompr, verEsistenza: CheckExistenceOf.PathFolderOnly, logMess: logMess) == false) { return(false); } if (PreparazioneDizionario(oggDaCompr, out dizionario, logMess) == false) { return(false); } if (dizionario.Count == 0) { Log.main.Add(new Mess(LogType.info, "Non ci sono file da comprimere")); return(true); } esito = false; thrZip = Thr.AvviaNuovo(() => esito = ThrComprimi(dizionario, percNomeFileCompr, formatoArchivio, livelloCompr, password, progressione)); if (timeOutMs != 0) { //Non attendo il completamento del thr se = 0 if (Thr.AttesaCompletamento(ref thrZip, timeOutMs) == false || esito == false) { return(false); } } if (thrZip.ThreadState == ThreadState.Aborted) { return(false); } return(true); } catch { return(false); } }
private void CalculateTandSw() { if (cmb_Wto.Text == "lbs") { S_w = Math.Round(Wto / Double.Parse(txt_W_S.Text), 1); Thr = Math.Round(Wto * Double.Parse(txt_T_W.Text), 1); txt_Thrust.Text = Thr.ToString(); txt_SurfaceArea.Text = S_w.ToString(); } }
internal static bool FiltraEccezioniQuery(Exception ex) { string mess, tipo; bool esito; mess = ex.Message; tipo = ex.GetType().ToString(); esito = false; if (esito == false && mess.Contains("timeout") && mess.Contains("query")) { esito = true; } if (esito == false && mess.Contains(".net") && mess.Contains("framework") && mess.Contains("data") && mess.Contains("provider")) { esito = true; //Sub:ThreadStart_Context->thrCicloSincronizzaOraConServer->ExecQuery | - Query:<SELECT excOra FROM excDispositivi WHERE idRnd='OV359' --***Sub: thrCicloSincronizzaOraConServer>, ErrDescr:<Errore .Net Framework Data Provider 30 interno.> , ErrNum:<5> } if (esito == false && mess.Contains("provider") && mess.Contains("tcp")) { esito = true; } if (esito == false && mess.Contains("Errore") && mess.Contains("collegamento") && mess.Contains("durante") && mess.Contains("comunicazione")) { esito = true; //Sub:ThreadStart_Context->thrCicloExchangeComandeEliminaTavoliChiusi->ExecQuery | - Query:<SELECT idRiga FROM excComande --***Sub: thrCicloExchangeComandeEliminaTavoliChiusi>, ErrDescr:<Errore di collegamento durante la comunicazione. Provider TCP: Il nome di rete specificato non è più disponibile.> , ErrNum:<5> } if (esito == false && mess.Contains("communication") && mess.Contains("link") && mess.Contains("failure")) { esito = true; } if (esito == false && mess.Contains("Impossibile creare una nuova connessione perché è attivata la modalità di transazione manuale o distribuita")) { esito = true; //<SELECT * FROM ExcCtrl WHERE nome='EventoInCorso'><Impossibile creare una nuova connessione perché è attivata la modalità di transazione manuale o distribuita.> lo ha generato poichè durante il runtime mi sono collegato ad un'altra rete } if (esito == false && mess.Contains("Riferimento a un oggetto non impostato su un'istanza di oggetto")) { esito = true; //ErrDescr:<Riferimento a un oggetto non impostato su un'istanza di oggetto.> , ErrNum:<91> } if (esito == false && mess.Contains("Executereader richiede una oggetto connection aperto e disponibile. lo stato attuale della connessione è connessione in corso")) { esito = true; //Sub:RunInternal->thrCicloSincronizzaOraConServer->ExecQuery | - Query:<SELECT excOra FROM excDispositivi WHERE idRnd='6A>Õ0' --***Sub: thrCicloSincronizzaOraConServer>, ErrDescr:<ExecuteReader richiede una oggetto Connection aperto e disponibile. Lo stato attuale della connessione è connessione in corso.> , ErrNum:<5> } if (esito == false && mess.Contains("Executereader richiede una oggetto connection aperto e disponibile. lo stato attuale della connessione è chiuso")) { esito = true; } if (esito == false && mess.Contains("La transazione non è associata alla connessione corrente oppure è stata completata")) { esito = true; //Sub:ThreadStart_Context->thrCicloExchangeComandeRicezione->ExecQuery | - Query:<SELECT idRiga FROM excComande --***Sub: thrCicloExchangeComandeRicezione>, ErrDescr:<La transazione non è associata alla connessione corrente oppure è stata completata.> , ErrNum:<5> } if (esito == false && Thr.FiltraEccezioniThreadNonCiclanti(ex) == true) { esito = true; } return(esito); }
internal UpLoad(string nome, object configSource = null) : base(nome) { queue = new ConcurrentDictionary <UInt64, UploadItem>(); this.config = new ConfigUpload(this.nome); //this.config = (ConfigUpload)Savable.Load(this.config); if (configSource != null) { this.config = (ConfigUpload)this.config.Load(configSource, out _); } thrScoda = Thr.AvviaNuovo(() => ThrCicloReadInputBufferAndElaborateMainQueue()); //ATTENZIONE deve stare dopo l'inizializzazione di coda }
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); } }
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)); } }
private void CambioProprietaOggT(object sender, PropertyChangedEventArgs args) { ProprietàOggTCambiata?.Invoke(this, args); //?.Invoke invice della parentesi tonda diretta poichè se nessuno ha sottoscritto l'evento non va in eccezione //se la proprietà dell'oggetto di tipo T che è cambiata è tra la lista delle prop.che concorrono all'ordinamento allora rieseguo l'ordinamento if ((from tmp in listaOrdinamenti where tmp.PropertyDescriptor.Name == args.PropertyName select tmp).Count() > 0) { if (this.oggConValidazione == true) //ATTENZIONE: Se c'è la validazione di un item della lista da parte del datagrid, tale validazione viene richiamata solamente una volta terminati gli eventi richiamati... { Thr.AvviaNuovo(() => thrAttesaValidazioneEOrdina(ref sender)); //...dall'onPropertyChange della proprietà variata(quindi al termine di questa CambioProprietaOggettoT), quindi lancio un thread separato... } else // ...che attenderà la fine della validazione per poi eseguire il riordino se l'oggetto risulterà valido { Ordina(); } } }
internal virtual void DoTest(int iter, int nThreads) { Thr[] tarr = new Thr[nThreads]; for (int i = 0; i < nThreads; i++) { tarr[i] = new Thr(this, iter, new System.Random((System.Int32)r.Next(System.Int32.MaxValue))); tarr[i].Start(); } for (int i = 0; i < nThreads; i++) { tarr[i].Join(); } if (failure != null) { Assert.Fail(failure); // TestCase.fail(failure); } }
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); } }
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); } }
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); } }
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)); } }
public bool ConnettiDB(Mess logMess = null) //StrConnection strConn = null, { if (logMess == null) { logMess = new Mess(LogType.Warn, Log.main.warnUserText); } this.DisconnettiDB(); //Seve perchè se riutilizzo più volte ConnettiDB dentro una stessa funzione devo chiudere la connessione precedente bool esito; Thread thread; string testoTmp; esito = false; if (connStr == null) { logMess.testoDaLoggare = "Impossibile connettersi al DB poichè connStr è null"; Log.main.Add(logMess); return(false); } if (connStr.DbRemoto == false) { try { cmd.Connection = new OleDbConnection(connStr.Completa); thread = Thr.AvviaNuovo(() => esito = ThrCDB_Exec()); if (Thr.AttesaCompletamento(ref thread, connStr.TimeOutConnMs) == false) { logMess.testoDaLoggare = "query:<" + cmd.CommandText + "> andata in timeOut, strConn.timeOutConnMs:<" + connStr.TimeOutConnMs + ">"; Log.main.Add(logMess); return(false); } if (esito == false) { testoTmp = thrEx != null ? ", ex.mess:<" + thrEx.Message + ">" : "il thread ThrCDB_Exec è ritornato false ma senza eccezioni"; logMess.testoDaLoggare = "strConn.completa:<" + connStr.Completa + ">" + testoTmp; Log.main.Add(logMess); return(false); } } catch { Log.main.Add(new Mess(LogType.ERR, logMess.testoDaVisual, "Non è stato possibile connettersi al DataBase locale, strConn.completa:<" + connStr.Completa + ">", visualMsgBox: false)); return(false); } } else { //Dim idRndXConnRemote As String //idRndXConnRemote = GeneraStrRandom(5) //While stackConnRemoteCmd.TryAdd(idRndXConnRemote, sqlCmd) = False ' * **ATTENZIONE: usare sempre 'TryAdd' e mai la 'GetOrAdd' poichè quest'ultima non è detto che lo faccia l'add //End While //While stackConnRemoteTra.TryAdd(idRndXConnRemote, sqlTra) = False ' * **ATTENZIONE: usare sempre 'TryAdd' e mai la 'GetOrAdd' poichè quest'ultima non è detto che lo faccia l'add //End While //While stackConnRemoteStato.TryAdd(idRndXConnRemote, 2) = False ' * **ATTENZIONE: usare sempre 'TryAdd' e mai la 'GetOrAdd' poichè quest'ultima non è detto che lo faccia l'add //End While //While stackConnRemoteStato(idRndXConnRemote) = 2 // Sleep(1) //End While //If stackConnRemoteStato(idRndXConnRemote) = 1 Then // sqlCmd = stackConnRemoteCmd.GetOrAdd(idRndXConnRemote, sqlCmd) // sqlTra = stackConnRemoteTra.GetOrAdd(idRndXConnRemote, sqlTra) // EliminaIdRndXConnRemote(idRndXConnRemote) // Return True //Else // EliminaIdRndXConnRemote(idRndXConnRemote) // Return False //End If } return(true); }
public bool ExecNoQuery(string query, CommitRoll commitRollback = CommitRoll.commitRollback, NuovaConn nuovaConn = NuovaConn.seNecessario, StrConnection strConn = null, Int32 timeOutQuery = 0, Mess logMess = null) { if (logMess == null) { logMess = new Mess(LogType.ERR, Log.main.errUserText); } logMess.testoDaLoggare = ""; Thread thread; Exception thrEx = null; bool esito; string testoTmp; if (PreExec(true, query, ref strConn, nuovaConn, ref timeOutQuery, logMess) == false) { return(false); } esito = false; thread = Thr.AvviaNuovo(() => esito = ThrENQ_Exec(out thrEx)); if (Thr.AttesaCompletamento(ref thread, timeOutQuery) == false) { //qua non faccio rollback poichè presumo che la connessione remota sia andata persa, se DB in locale non può andare in timeout logMess.testoDaLoggare = "query:<" + cmd.CommandText + "> andata in timeOut:<" + timeOutQuery + ">"; Log.main.Add(logMess); return(false); } if (esito == false) { try { if (commitRollback == CommitRoll.commitRollback || commitRollback == CommitRoll.soloRollback) { tra.Rollback(); this.DisconnettiDB(); } } catch (Exception ex) { logMess.testoDaVisual = ""; //Non visualizzo nulla poichè c'è il l'altro log sotto logMess.testoDaLoggare = "eccezione durante rollback, ex.Mess:<" + ex.Message + ">, query:<" + query + ">"; Log.main.Add(logMess); } if (thrEx != null) { if (FiltraEccezioniQuery(thrEx) == true) { logMess.testoDaVisual = ""; logMess.tipo = LogType.Warn; } testoTmp = "ex.mess:<" + thrEx.Message + ">"; } else { testoTmp = "il thread ThrENQ_Exec è ritornato false ma senza eccezioni"; } logMess.testoDaLoggare = "query:<" + cmd.CommandText + ">, " + testoTmp; Log.main.Add(logMess); return(false); } try { if (commitRollback == CommitRoll.commitRollback) { tra.Commit(); this.DisconnettiDB(); } } catch (Exception ex) { if (FiltraEccezioniCommit(ex) == true) { logMess.testoDaVisual = ""; logMess.tipo = LogType.Warn; } logMess.testoDaLoggare = "errore durante 'sqlTra.Commit()', ex.Mess:<" + ex.Message + ">, query:<" + query + ">"; Log.main.Add(logMess); return(false); } return(true); }
public void Run() { int i = 1; while (i <= countDetailsInModel) { try { Program.s.WaitOne(); Thread.Sleep(100); if (Program.conveyor.Count != 0 && !Program.overflow) { Detail d = Program.conveyor.Dequeue(); if (d.numModel == numModel && d.numPosInModel == i) { Console.WriteLine("Деталь № " + d.numPosInModel + " подошла для модели № " + numModel + "!!!!!!!!!!!!!!"); Console.WriteLine(); if (i == countDetailsInModel) { Console.WriteLine("Модель № " + numModel + " собрана" + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); Thr.Abort(); } else { i++; } } else { if (Program.conveyor.Count < Program.lengthOfConveyor) { Console.WriteLine("Деталь № " + d.numPosInModel + " не подошла для модели № " + numModel); Program.conveyor.Enqueue(d); Console.WriteLine("Деталь № " + d.numPosInModel + " возвращена на конвейер"); Console.WriteLine(); } else { Console.WriteLine("Конвейер переполнен! Завод стоит!"); Program.overflow = true; } } } Program.s.Release(); } catch (ObjectDisposedException ex) { Console.WriteLine(ex.Message); Console.WriteLine("Текущий экземпляр семафора уже был удален"); } catch (AbandonedMutexException ex) { Console.WriteLine(ex.Message); Console.WriteLine("Ожидание завершено, поскольку поток завершил работу, не освободив семафор."); } catch (InvalidOperationException ex) { Console.WriteLine(ex.Message); Console.WriteLine("Текущий экземпляр является прозрачный прокси для WaitHandle в другом домене приложения."); } } }
//ATTENZIONE res se non è un ref non funziona public bool ExecQuery <T1>(string query, ref T1 res, QryOut @out = QryOut.dataTable, NuovaConn nuovaConn = NuovaConn.seNecessario, StrConnection strConn = null, int timeOutQuery = 0, Mess logMess = null) { //Attenzione: l'out come Datatable costa di più in termini di cpu, dataReader costa meno if (logMess == null) { logMess = new Mess(LogType.ERR, Log.main.errUserText); } logMess.testoDaLoggare = ""; Thread thread; Exception thrEx = null; bool esito; string testoTmp; if (PreExec(true, query, ref strConn, nuovaConn, ref timeOutQuery, logMess) == false) { return(false); } if (res == null) { this.@out = @out; } else { if (res.GetType() == typeof(DataTable)) { this.@out = QryOut.dataTable; } else if (res.GetType() == typeof(OleDbDataReader)) { this.@out = QryOut.dataReader; } else { logMess.testoDaLoggare = "ricevuto res con tipo disatteso, res.GetType.Name:<" + res.GetType().Name + ">"; Log.main.Add(logMess); return(false); } } esito = false; //se si perde la connessione prima di eseguire cmd.ExecuteReader() (può succede per DB remoto quando si è già connessi, quindi con nuovaConn=False) passano 47 secondi prima che ritorna l'errore data provider interno 30, thread = Thr.AvviaNuovo(() => esito = ThrEQ_Exec(ref thrEx), ApartmentState.MTA); //Attenzione se STA, alla 'resOle.Close()' c'è l'eccezione: Impossibile utilizzare oggetti COM separati dai relativi RCW sottostanti. if (Thr.AttesaCompletamento(ref thread, timeOutQuery) == false) { logMess.testoDaLoggare = "query:<" + cmd.CommandText + "> andata in timeOut:<" + timeOutQuery + ">"; Log.main.Add(logMess); return(false); } if (esito == false) { if (thrEx != null) { if (FiltraEccezioniQuery(thrEx) == true) { logMess.testoDaVisual = ""; logMess.tipo = LogType.Warn; } testoTmp = "ex.mess:<" + thrEx.Message + ">"; } else { testoTmp = "il thread ThrEQ_Exec è ritornato false ma senza eccezioni"; } logMess.testoDaLoggare = "query:<" + cmd.CommandText + ">, " + testoTmp; Log.main.Add(logMess); return(false); } //Ho dovuto eseguire la resDt.Load(cmd.ExecuteReader()) nel delegato poichè se esegiuvo la resDt.Load(DataReader) qua da la seguente eccezione //Impossibile eseguire il cast di oggetti COM di tipo 'System.__ComObject' in tipi di interfaccia 'IRowset'. L'operazione non è stata completata perché la chiamata QueryInterface sul componente COM per l'interfaccia con IID '{ 0C733A7C - 2A1C - 11CE - ADE5 - 00AA0044773D} //non è riuscita a causa del seguente errore: Interfaccia non supportata. (Eccezione da HRESULT: 0x80004002 (E_NOINTERFACE)). if (res != null) { if (this.@out == QryOut.dataTable) { res = (T1)(dynamic)ResDt; } else if (this.@out == QryOut.dataReader) { res = (T1)(dynamic)ResOle; } } return(true); }
private void InitBlock(Thr enclosingInstance) { this.enclosingInstance = enclosingInstance; }
internal virtual void DoTest(int iter, int nThreads) { Thr[] tarr = new Thr[nThreads]; for (int i = 0; i < nThreads; i++) { tarr[i] = new Thr(this, iter, new System.Random(), 1); tarr[i].Start(); } for (int i = 0; i < nThreads; i++) { tarr[i].Join(); } if (failure != null) { Assert.Fail(failure); } }
internal virtual void DoTest(int iter, int nThreads) { Thr[] tarr = new Thr[nThreads]; for (int i = 0; i < nThreads; i++) { tarr[i] = new Thr(this, iter, new System.Random((System.Int32) r.Next(System.Int32.MaxValue))); tarr[i].Start(); } for (int i = 0; i < nThreads; i++) { tarr[i].Join(); } if (failure != null) { Assert.Fail(failure); // TestCase.fail(failure); } }
public AnonymousClassFieldSelector(Thr enclosingInstance) { InitBlock(enclosingInstance); }
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(); } }
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 }
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 }
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(); } }