Come ovviare a "perdita di tempo" durante upload FTP

di il
12 risposte

Come ovviare a "perdita di tempo" durante upload FTP

Buongiorno a tutti.
sono a chiede un vostro consiglio a riguardo di un problema che mi mi è sorto nel momento in cui invio un file json via ftp.
In pratica ho un programma, che in modo scadenzato memorizza un peso ogni tot secondi su un DB SQL server.
Sempre a tempo scadenzato, questi pesi vengono presi da una query, impacchettati in formato json, ed il file viene inviato via FTP.
Ho notato che, se ad esempio devo registrare il peso ogni 2 secondi, ed inviare il file ogni 5 minuti, nel momento dell'invio, (uso FtpWebRequest), il software rimane in "attesa" della conclusione dell'invio, per cui il timer di registrazione pesate è come se si stoppasse.
Se controllo nella tabella delle pesate registrate (ho anche un campo data ora), vedo che normalmente ogni 2 pesate c' e'' un record, mentre quando fa l'invio, mediamente tra una pesata e l'altra passano 6-8 secondi.
C' e' un modo per ovviare a questo, che in pratica è una perdita di dati.....
Grazie 100 a tutti per gli eventuali suggerimenti.

Buona giornata
Daniele G

12 Risposte

  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Usa il multithreading, due thread diversi per le due attività
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Grazie Oregon,
    non ho li ho mai usati, non so se sia complicato o meno.
    Hai cortesemente qualche link in cui posso vedere un esempio di applicazione a livello di codice ?
    Grazie come sempre

    Daniele G
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Puoi fare una ricerca con Google per avere mille riferimenti ed esempi. Non è possibile proporti un link in particolare per risolvere il tuo problema specifico, dovrai comunque implementare il codice secondo le tue esigenze.

    Non è un argomento complesso ma richiede un minimo di studio, però, ripeto, è tutto molto documentato.

    Parti da

    https://docs.microsoft.com/it-it/dotnet/standard/threading/using-threads-and-threading
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Mi documento.
    Grazie 1000

    Daniele G
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Ovviamente Oregon ti ha dato la soluzione corretta, e per iniziare potresti anche guardare l'oggetto BackgroundWorker, io il tuo problema l'ho risolto così.

    https://docs.microsoft.com/it-it/dotnet/desktop/winforms/controls/backgroundworker-component?view=netframeworkdesktop-4.8
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Grazie ancora a tutti,
    ho usato la soluzione indicata da Oregon, al momento pare funzionare molto bene.
    Ne approfitto per una domanda:
    Una volta che ho assegnato il thread e lo faccio partire

    Dim trd As New Threading.Thread(AddressOf UploadFile)
    trd.Start()

    questo si "chiude" automaticamente da solo, una volta terminata la procedura che gli è stata assegnata ?
    o bisogna dare qualche istruzione ?
    Grazie

    Daniele G
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Dipende da cosa esegui al suo interno, che non hai mostrato.

    Se fai solo il trasferimento FTP, al termine del suo codice il thread sarà terminato.
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Si esattamente, eseguo il trasferimento FTP, e se non vi è alcun errore viene eseguita una query sul DB, che va a flaggare i record inviati.
    Grazie

    Ciao
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    A proposito di "terminare" il thread, ricordati che sarebbe opportuno gestire la fase di chiusura dell'app.

    Stando alle tue indicazioni, ad intervalli regolari devi fare un upload che, essendo un'operazione pesante, è stato spostato all'interno di un thread per consentire al resto dell'applicazione di procedere in modo regolare.

    Fin qui tutto bene.

    Ma cosa deve accadere se l'utente prova a chiudere l'applicazione mentre il thread di upload del file è ancora attivo?
    Di norma le opzioni sono due:
    - Deve essere terminato l'upload prima di chiudere l'applicazione: in questo caso sarebbe bene avvisare l'utente che l'app sta attendendo il termine dell'upload per potersi chiudere (occhio che per assurdo potrebbero esserci più upload ancora pendenti)
    - L'upload deve essere abortito per chiudere l'app


    Non so se hai già gestito il caso.
    Lo faccio presente perchè è un aspetto che spesso si dimentica quando si lavora coi thread
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Grazie per la dritta,
    in effetti posso avere 4 upload contemporanei (il form che fa tutte le operazioni, viene istanziato 4 volte, perchè le operazioni sono identiche, ogni istanza di form punta alla propria tabella SQL).
    In che modo posso accorgermi che il thread è in sescuzione ?
    Grazie 1000

    Saluti
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Le alternative dipendono da come gestisci il tutto (architettura).

    Di solito ho visto queste due opzioni (in ordine di mia preferenza):
    - Si usa una variabile di tipo Thread in cui si imposta il thread di esecuzione upload. In fase di chiusura finestra, se la variabile è diversa da null, si richiama il metodo Join che esce quando il thread finisce.
    - Si una una variabile per indicare se ci sono thread attivi o meno. Quando si avvia un thread, la si incrementa. Quando un thread finisce, la si decrementa. In fase di chiusura finestra si fa un ciclo che attende fino a che la variabile non arriva a zero (nessun processo attivo)


    Vedi tu quale strada preferisci e/o cerca un po' in internet, di opzioni ce ne sono diverse.
  • Re: Come ovviare a "perdita di tempo" durante upload FTP

    Ok bene, mi documento ulteriormente.
    Grazie ancora a tutti

    Saluti
Devi accedere o registrarti per scrivere nel forum
12 risposte