Quote Originariamente inviata da BoBoPoP Visualizza il messaggio
quello sopra è un estratto del codice, mi nasce un errore quando invoco gli altri delegati che svolgono funzioni nel mainform.
Non mi è chiaro il ruolo del ciclo For che praticamente non dovrebbe esserci, visto che la ProgressBar andrebbe aggiornata in modo significativo: se le tue procedure di calcolo finiscono prima, il programma dovrà teoricamente attendere la fine del ciclo (fino a 1000), con un secondo di attesa a ogni iterazione, quindi 1000 secondi almeno per poter giungere alla fine, mentre la ProgressBar andrebbe aggiornata impostando un valore sensato, per intenderci che segnali il 90% quando ci si trova al 90% dell'intero processo.

In caso contrario, oltre a non servire, fornisce una informazione fuorviante.

Il problema principale credo sia da ricercare nel fatto che si utilizza o si fa riferimento sempre al MainForm, anche dal thread secondario, e questo non dovrebbe avvenire: è il thread principale dell'applicazione che ha la responsabilità di aggiornare l'interfaccia dell'utente, e quindi di agire sui Form, sui controlli che ne fanno parte e così via, ricevendo i messaggi corretti.

Il thread secondario deve occuparsi delle operazioni che coinvolgono calcoli o un processo lungo, ma non deve interagire con il MainForm.

Tutt'al più, è il MainForm che grazie al riferimento al thread secondario, può andarsi a leggere dei campi o delle proprietà che contengano valori significativi da mostrare, come l'operazione in corso, oppure il punto in cui si è arrivati (da mettere nella ProgressBar).

Io proverei a guardare qualsiasi demo che fa uso del BackgroundWorker per un approfondimento e nozioni importanti in merito a questa fondamentale suddivisione dei compiti.

Ciò non vuol dire che un thread secondario non possa aggiornare l'interfaccia, ma dovendolo fare in modo coordinato e non simultaneo al thread principale, la necessità di sincronizzazione introduce una complessità inutile e rallenta senza motivo il processo che gira in background nel thread secondario.

Riassumendo, bisogna rivedere la struttura del codice seguendo le indicazioni fornite e gli esempi disponibili anche in rete per questi scenari.

Ciao!