Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Ma è rimasto un solo problema, quello della progressBar, mi da la seguente eccezione:
Codice sorgente - presumibilmente Plain Text
System.InvalidOperationException: 'Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'progressBar1' da un thread diverso da quello da cui è stata eseguita la creazione.'
Se si decommentano le seguenti righe funziona ma senza progressBar ovviamente:
Codice sorgente - presumibilmente Plain Text
Nel metodo GetFiles
progressBar1.Value = 0;
progressBar1.Maximum = (int)bytesTotali;
Codice sorgente - presumibilmente C# / VB.NET
Nella funzione CopyFilesAsync()
int percentuale = Convert.ToInt32(((numRead / bytesTotali) * 100));
backgroundWorker1.ReportProgress(percentuale);
Spero che qualcuno mi possa dare una mano, ci ho provato e riprovato ma niente
Continuerò a provare ma la vedo dura questa volta, spero in un aiuto da voi esperti.
Ovviamente, non puoi riportare il valore alla progressbar da un thread o task diverso da quello dove
viene inizializzato il controllo.
Ma si può semplicemente ovviare a questo problema utilizzando un delegato.
System.InvalidOperationException: 'Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'progressBar1' da un thread diverso da quello da cui è stata eseguita la creazione.'
Per prima cosa, Utilizza il debugger.
Senza di quello non si và da nessuna parte
1° Inserisci un breakpoint prima del metodo invoke.
Se fino a li, non ti crasha nulla significa che c'è qualche problema in quel metodo.
2° Inserisci un breakpoint subito dopo la funzione invoke.
Se passa il metodo, significa che il problema è altrove.
quindi dovrai cercare di capire seguendo il debugger dove sta il problema.
intercettarlo è risolverlo.
perché ho provato da me, il metodo invoke serve proprio per poter manipolare controlli al di fuori
del thread principale.
Quindi se sbaglio io, credo che sbaglieranno tantissime persone.
Ma non si può dare nulla di scontato sopratutto nella programmazione.
Quindi prova a fare in questo modo.
Se nemmeno funziona, cerchiamo di capire dove sta il problema
Ciao Thejuster ho provato a mettere vari breakpoint
Il primo problema è capitato a questa linea:
Codice sorgente - presumibilmente Plain Text
progressBar1.Maximum = (int)bytesTotali;
che mostra la stessa eccezione.
Ho provato anche li ad inserire il delegato cosi:
Codice sorgente - presumibilmente Plain Text
this.Invoke((MethodInvoker)delegate
{
progressBar1.Value = 0;
progressBar1.Maximum = (int)bytesTotali;
});
se riprovo va avanti.
Poi arriva a questa riga di codice:
Codice sorgente - presumibilmente Plain Text
backgroundWorker1.ReportProgress(percentuale);
e mostra questa eccezione:
System.InvalidOperationException: 'OperationCompleted è già stato chiamato sull'operazione. Non sono consentite ulteriori chiamate.'
anche se la uso cosi:
Codice sorgente - presumibilmente C# / VB.NET
this.Invoke((MethodInvoker)delegate
{
int percentuale = Convert.ToInt32(((numRead / bytesTotali) * 100));
backgroundWorker1.ReportProgress(percentuale);
});
e mostra sempre questa eccezione:
System.InvalidOperationException: 'OperationCompleted è già stato chiamato sull'operazione. Non sono consentite ulteriori chiamate.'
il problema si trova sempre in queste righe:
Codice sorgente - presumibilmente C# / VB.NET
progressBar1.Maximum = (int)bytesTotali;
int percentuale = Convert.ToInt32(((numRead / bytesTotali) * 100))
backgroundWorker1.ReportProgress(percentuale);
però non capisco il motivo.
Ultima modifica effettuata da lupetto77 il 22/06/2017 alle 23:15