195 messaggi dal 02 novembre 2010
Ciao a tutti.
Ho appena scoperto l'esistenza del BackgroundWoker e sto cercando di implementarlo assieme ad un Timer.

In sostanza il funzionamento è questo:

1. Click di start

2. Predisposizione del Timer che allo scadere invoca il metodo Sveglia.

3. Il metodo Sveglia ha il seguente codice al suo interno
if (backgroundWorker1.IsBusy != true)
{
   backgroundWorker1.RunWorkerAsync();
}


4. Viene quindi richiamato automaticamente il metodo _DoWork nel quale vengono effettuate le varie elaborazioni e richiamato di volta in volta il metodo .ReportProgress()

5. Il metodo ReportProgress dovrebbe quindi aggiornare la LABEL (cosa che invece non avviene)

6. Al termine il metodo RunWorkerCompleted segnala invece che si sta cercando di accedere ad un controllo che in realtà non "appartiene" a quel Thread.


Sapete darmi qualche suggerimento?
10.599 messaggi dal 09 febbraio 2002
Contributi
Ciao,
è normale che ti dia quell'errore. Infatti, solo il thread della UI può aggiornare la UI. Il codice del BackgroundWorker va invece in esecuzione su un thread secondario che non ha questa prerogativa. Leggi qui:
https://msdn.microsoft.com/en-us/library/ff699141.aspx

Per risolvere, usa il metodo BeginInvoke della label. Qui trovi un esempio adatto al tuo caso:
https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls
Guarda in particolare il corpo del metodo SetText.

Comunque, il BackgroundWorker è un oggetto ormai desueto, dovresti usare la Task Parallel Library. Qui trovi una serie di 5 articoli che mettono a confronto BackgroundWorker e Task.
https://blog.stephencleary.com/2013/05/taskrun-vs-backgroundworker-round-1.html

ciao,
Moreno
Modificato da BrightSoul il 11 maggio 2018 20.50 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.