Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584

    [VB.NET] Aggiornare stato di avanzamento per chiamata a servizio Web

    salve a tutti
    ho un servizio web che uso per sincronizzare i prodotti di un programma locale, il servizio accetta un dataset come parametro
    esso ha anche diverse funzioni, per dire la percentuale di avanzamento e che tabella sta operando

    attualmente il codice che mi permette di aggiornare la label di stato è questo:
    tutto inserito in un controllo timer settato a due secondi:
    codice:
      Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
         
                Application.DoEvents()
                LBL_Stato.BeginInvoke(New InvokeDelegate(AddressOf AggiornaStatoDaServizio))
                Dim demoThread As Thread = Nothing
                demoThread = New Thread(New ThreadStart(AddressOf AggiornaStatoDaServizio))
                demoThread.Start()
    
    
        End Sub
        Public Sub AggiornaStatoDaServizio()
          
            LBL_Stato.BeginInvoke(New InvokeDelegate(AddressOf invokeMethod))
            ProgressBar1.BeginInvoke(New InvokeDelegate(AddressOf invokeMethod))
    
    
            Me.ProgressBar1.Value = s.GetStatoUpload(FTPguid)
          
        End Sub 
        Private Sub invokeMethod()
          
            Me.LBL_Stato.Text = My.Resources._FRM_EsportazioneDati.Aggiornamentotabella & ObjExport.NomeTabella & My.Resources._FRM_EsportazioneDati.record & ObjExport.IndexArrivato & My.Resources._FRM_EsportazioneDati.di & ObjExport.NumRecordTabella
    
    
        End Sub
    il problema è che sebbene l'operazione richieda tempo, mi da solo un aggiornamento di stato, sebbene toericamente ne dovreivedere una decina, il codice secondo voi è esatto?
    forse perchè non ho molta confidenza con i delegate
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  2. #2
    Quel codice non mi sembra abbia senso, e la strada per ottenere codice asincrono funzionante non è buttare a caso timer, DoEvents, BeginInvoke e thread...
    Spiega meglio la situazione:
    - hai un metodo del webservice bloccante lento? se sì, dove viene chiamato?
    - o hai un metodo asincrono che restituisce immediatamente e puoi fare polling sullo stato?
    - o altro ancora?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Quel codice non mi sembra abbia senso, e la strada per ottenere codice asincrono funzionante non è buttare a caso timer, DoEvents, BeginInvoke e thread...
    Spiega meglio la situazione:
    - hai un metodo del webservice bloccante lento? se sì, dove viene chiamato?
    - o hai un metodo asincrono che restituisce immediatamente e puoi fare polling sullo stato?
    - o altro ancora?
    no, il problema non è il webservice, o almeno no ho il codice sottomano per dirlo,
    da quel che ricordo il programmatore che si occupava di cio (altra ditta), non usava
    i thread, ma penso che abbia messo su solo semplici funzioni.

    il problema è che al client non ho la reale situazione di dove è arrivato
    con il codice che ho fatto ho solo un paio di indicazioni sullo stato di avanzamento, e cmq
    dici he non va bene il codice?
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Quote Originariamente inviata da Kahm Visualizza il messaggio
    no, il problema non è il webservice, o almeno no ho il codice sottomano per dirlo,
    da quel che ricordo il programmatore che si occupava di cio (altra ditta), non usava
    i thread, ma penso che abbia messo su solo semplici funzioni.

    il problema è che al client non ho la reale situazione di dove è arrivato
    con il codice che ho fatto ho solo un paio di indicazioni sullo stato di avanzamento, e cmq
    dici he non va bene il codice?
    Ciao kahm,
    allora.. vediamo un pò : Tu hai un web service che "fa qualcosa" e "restituisce qualcosa", e ok, ma questo cos'ha a che vedere con i thread e la barra di avanzamento? Ora io immagino che o il web service (quando invocato) restituisce un valore di avanzamento per una non meglio definita operazione in background nel server, quindi il thread separato ti serve per chiamare un ipotetico servizio che ti rende il valore di avanzamento senza freezare la UI, oppure vuoi simulare con un timer il tempo ipotetico per l'operazione (come potrebbe essere un conto alla rovescia). Ora io immagino che sia la prima, quantomeno da questo :
    codice:
    s.GetStatoUpload(FTPguid)

    sei certo che ogni volta che lo chiami lui ti da la percentuale corretta? non è che è quello che rimane basso? come funziona il sistema, o meglio come nel web service sei a conoscenza della percentuale che verrà poi restituita al client?
    Altra cosa: sei certo di aver allineato i valori restituiti dal web service con la progressbar? potrebbe capitare che il massimo è una cifra quasi irraggiungibile (max e steps) e richiedere per questo una marea di steps (quindi vedi la barra sempre molto bassa).

    Ma quel Application.DoEvents? che centra? il codice lo sistemiamo dopo magari, non mi sembra proprio corretto...


    Come già detto da MItaly spiega meglio...

  5. #5
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    Quote Originariamente inviata da U235 Visualizza il messaggio
    Ciao kahm,
    allora.. vediamo un pò : Tu hai un web service che "fa qualcosa" e "restituisce qualcosa", e ok, ma questo cos'ha a che vedere con i thread e la barra di avanzamento? Ora io immagino che o il web service (quando invocato) restituisce un valore di avanzamento per una non meglio definita operazione in background nel server,.
    si esatto, il web service, valorizza una property riguardo la tabella che sta gestendo e il grado di avanzamento
    sei certo che ogni volta che lo chiami lui ti da la percentuale corretta? non è che è quello che rimane basso? come funziona il sistema, o meglio come nel web service sei a conoscenza della percentuale che verrà poi restituita al client?
    .
    un'altro programmatore sempre di un'altra ditta ha usato lo stesso webservice e sembrava andare bene ,

    .
    Altra cosa: sei certo di aver allineato i valori restituiti dal web service con la progressbar? potrebbe capitare che il massimo è una cifra quasi irraggiungibile (max e steps) e richiedere per questo una marea di steps (quindi vedi la barra sempre molto bassa).
    si, passato un dataset, sono in grando di capire quante tabelle e quanti recordi di ogni tabella contiene,quindi il max è corretto
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  6. #6
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao,
    bene, se sei certo che il web service funziona, allora (se usi NET 4.5) dovrebbe andar bene un metodo async :
    codice:
    Private Async SubTimer1_Tick(ByVal sender As System.Object,ByVal e As System.EventArgs)HandlesTimer1.Tick
        Dim stato = s.GetStatoUploadAsync(FTPguid)
        Me.ProgressBar1.Value= Await stato 
        Label...
        Altro...
    EndSub
    

  7. #7
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    si, per ogni metodo c'è un corrispondente con Async finale! quindi sono sicuro: utilizza il 4.5!
    sto spulciando il web per capire questo nuovo modo di sincronizzare i dati
    è un po complesso....

    se mi dici che il codice da te dato funziona posso studiarlo e applicarlo
    nel web vedo montagne di codice nelle spiegazioni ;(
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  8. #8
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao Kahm,
    immagino abbia già provato a quest'ora...
    Comunque si, funzione
    "Montagne di codice" le trovi per fare cose più complesse di questa, per fare quello che devi fare tu ora dovrebbero bastare quelle due righe net 4.5.

    magari fammi sapere se riesci.

  9. #9
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    Quote Originariamente inviata da U235 Visualizza il messaggio
    Ciao Kahm,
    immagino abbia già provato a quest'ora...
    Comunque si, funzione
    "Montagne di codice" le trovi per fare cose più complesse di questa, per fare quello che devi fare tu ora dovrebbero bastare quelle due righe net 4.5.

    magari fammi sapere se riesci.
    beh sono nuovo, quindi mi trovi un po spaesato
    diciamo hce al codice:
    codice:
        Private Async Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim stato = s.GetStatoUploadAsync(FTPguid)
        Me.ProgressBar1.Value= Await stato 
    End Sub
    nella prima riga dove dichiara il timer async, da errore:"variable declaration without 'as' clause"
    non penso che il possa essere un evento, forse debba solo essere chiamata una funzione sync

    poi il pezzo :GetStatoUploadAsync, dice : l'espressione non produce un valore, eppure getStatoUpload lo fa, forse non devo richiamare la funzione async creata in automatico?

    grazie per i chiarimenti
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  10. #10
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao Kahm,
    il primo dovrebbe essere solo un Warning, dovuto probabilmente alla mancata dichiarazione del tipo restituito, dovrebbe bastare fare una cosa del genere :
    codice:
    Dim stato As Task(Of Int32) = s.GetStatoUploadAsync(FTPguid)
    Mentre per il secondo non saprei, ma se il tuo è un web service net 4.5 e hai copiato il codice non dovresti avere problemi...
    Il dubbio è che non stia usando un WCF con Net inferiore a 4.5 che contengono anche loro il finale asyn, ma si usa in maniera diversa, ovvero con gli eventi e metodi asincroni.

    Se vuoi posta il progetto o mostra qualche elemento che ci aiuti a capire.
    Ultima modifica di U235; 03-09-2014 a 14:15

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.