Come ovviare a "perdita di tempo" durante upload FTP

di DanieleG il
12 risposte
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

  • Usa il multithreading, due thread diversi per le due attività
  • 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
  • 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
  • Mi documento.
    Grazie 1000

    Daniele G
  • 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
  • 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.
  • 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
  • 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
  • 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
  • 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.
  • Ok bene, mi documento ulteriormente.
    Grazie ancora a tutti

    Saluti
Devi accedere o registrarti per scrivere nel forum
12 risposte