Oppure

Loading
09/10/20 10:37
fosforo
Ciao
Ho creato una form che contiene una Label e un ProgressBar.
Nella classe Form_Load ho una loop che da i valori sia alla Label che alla ProgressBar e chiamo una classe che copia semplicemente dei file da una cartella ad un'altra.

Purtroppo visualizzo la Label e la ProgressBar solo alla fine della copia.

Aggiungo il semlplice codice:
private void CopyFile_Load(object sender, EventArgs e)
{
progressBar1.Maximum = _file.Count;
for (int i = 0; i < _file.Count; i++)
{
progressBar1.Value = i + 1;
label1.Text = String.Empty;
label1.Text = "COPYNG: " + _fileMissOdd[i];
Copy_FileEven(i); // chiamo la copiaFile
label1.Refresh();
progressBar1.Refresh();
this.Refresh();
}
label1.Text = "COMPLETE";
}
aaa
10/10/20 19:25
nessuno
Cosa è la Copy_fileevent ??
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
11/10/20 0:03
Carlo
Postato originariamente da fosforo:

Aggiungo il semlplice codice:
private void CopyFile_Load(object sender, EventArgs e)
{
progressBar1.Maximum = _file.Count;
for (int i = 0; i < _file.Count; i++)
{
progressBar1.Value = i + 1;
label1.Text = String.Empty;
label1.Text = "COPYNG: " + _fileMissOdd[i];
Copy_FileEven(i); // chiamo la copiaFile
label1.Refresh();
progressBar1.Refresh();
this.Refresh();
}
label1.Text = "COMPLETE";
}


Il codice che hai postato deve incrementare la progressbar ad ogni file copiato, e non mentre copia il file.
Il codice che hai postato se copia i file in modo sincrono e sembra di si, mentre esegue le operazioni di copia smetterà di aggiornare il form principale perché occupato in altri compiti, hai messo Refresh(), ma non è sufficiente, devi imporre l'aggiornamento del form ogni volta che un file è stato copiato, con DoEvents.
        private void CopyFile_Load(object sender, EventArgs e)
        {
            progressBar1.Maximum = _file.Count;
            progressBar1.Minimum = 0;

            for (int i = 0; i < _file.Count; i++)
            {
                progressBar1.Value = i ;
                label1.Text = "COPYNG: " + _fileMissOdd;
                Copy_FileEven(i); // chiamo la copiaFile
                Application.DoEvents; // aggiorna il form, e altro
            }
            label1.Text = "COMPLETE";
        } 


Null'altro potrai fare mentre i file vengono copiati, se usi un metodo asincrono, potrai avere due progressbar una per i file copiati e una per il progresso del file in corso di copia.
Ultima modifica effettuata da Carlo 11/10/20 0:14
in programmazione tutto è permesso
11/10/20 10:42
Thejuster
Usa il tutto in un Thread separato.
dovresti risolvere il problema credo.


separa il codefile dal load form


private void CopyFile_Load(object sender, EventArgs e)
{
     Thread t = new Thread(CopyFile);
     t.Start();

}



private void CopyFile()
        {
             Invoke(new Action(delegate
                {

            progressBar1.Maximum = _file.Count;
            for (int i = 0; i < _file.Count; i++)
            {
                progressBar1.Value = i + 1;
                label1.Text = String.Empty;
                label1.Text = "COPYNG: " + _fileMissOdd;
                Copy_FileEven(i); // chiamo la copiaFile
                label1.Refresh();
                progressBar1.Refresh();
                //this.Refresh(); non serve.
            }
            label1.Text = "COMPLETE";
            
            }));
        
        }



Separa la funzione che mostra il progresso con l'apertura del form.
questo può causare proprio blocchi di questo genere.
Poi ti consiglio quando si tratta di effettuare operazioni che richiede un tot di tempo, o come in questo caso, di separare sempre il tutto in un Thread diverso da quello principale.
così ne guadagni in prestazioni e velocità.
proprio come diceva carlo

metodo asincrono

Ultima modifica effettuata da Thejuster 11/10/20 10:47
mire.forumfree.it/ - Mire Engine
C# UI Designer
13/10/20 6:42
fosforo
Ciao

Grazie per le risposte, sempre preziose.
Con il vostro aiuto ho risolto ma devo ammettere che non è tutto chiaro.
Devo studiare.
Ho trovato molto interessante l'argomento delle operazioni Sincrone e Asincrone, di cui non so praticamente nulla.
Dove potrei trovare materiale per approfondire?


Grazie per l'aiuto.
aaa
13/10/20 8:42
Carlo
con backgroundworker:
docs.microsoft.com/en-us/dotnet/api/…
con async:
docs.microsoft.com/it-it/dotnet/csharp/programming-guide/concepts/async/
Nelle MSDN ci sono altri articoli ed esempi, per le ricerche usa:
backgroundworker
async
await

Per copiare i file, dopo che hai letto le MSDN, guarda questo:
stackoverflow.com/questions/6044629/…
Ultima modifica effettuata da Carlo 13/10/20 9:44
in programmazione tutto è permesso
16/10/20 6:25
fosforo
Grazie Carlo :k::k:
aaa