31 messaggi dal 03 aprile 2014
salve a tutti, eccomi nuovamente sul forum in cerca di aiuto..

in breve ho bisogno che quando chiamo un BackgroundWorker, il thread chiamante si blocchi in attesa che il BackgroundWorker finisca di lavorare ovviamente senza bloccare la UI...

questa mia esigenza nasce perchè il programmino fà un calcolo che richiede qualche secondo di tempo, in quel momento come sapete la UI si blocca e quindi ho inserito una loadingbar dentro il BackgroundWorker, il problema e che durante l'operazione il primo thread continua a lavorare, ma ovviamente si ferma perchè ha bisogno dei risultati generati dalla blocco BackgroundWorker....


quindi come posso risolvere il problema senza bloccare la UI?

ho già provato uno sleep ed AutoResetEvent ma tutta la UI si pianta con la conseguenza di bloccare anche la loading bar...

l'unica soluzione sarebbe quella di spostare tutte le operazioni dentro la RunWorkerCompleted, ma è una cosa che mi vorrei evitare volentieri....

suggerimenti??

grazie in anticipo.
11.885 messaggi dal 09 febbraio 2002
Contributi
ciao,

oncelot ha scritto:

l'unica soluzione sarebbe quella di spostare tutte le operazioni dentro la RunWorkerCompleted, ma è una cosa che mi vorrei evitare volentieri....

E' corretto, perché vuoi evitarlo? Se non vuoi porre la logica su un'altro metodo, puoi crearti un delegato al volo usando una lambda expression.

bw.RunWorkerCompleted += (sender, arg) => {
   //fai qualcosa
};

Se hai bisogno di aggiornare l'interfaccia grafica da lì, dovrai andare di Invoke.
http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c#answer-661706

A proposito, ma la tua è un'applicazione Winforms?

Penso che tu lo sappia ma, in alternativa al BackgroundWorker, potresti usare i Task. Leggi questo articolo di Marco De Sanctis.
http://www.winfxitalia.com/articoli/netfx4/multithreading-parallelismo.aspx
Anziché sottoscrivere un evento, i Task ti danno la possibilità di definire una continuation, ovvero un'azione da eseguire al termine del task. Questa continuation può essere eseguita nel contesto nel thread chiamante, e quindi potrai aggiornare la UI direttamente, senza bisogno dell'Invoke.
http://reedcopsey.com/2009/11/17/synchronizing-net-4-tasks-with-the-ui-thread/

ciao,
Moreno
Modificato da BrightSoul il 09 ottobre 2014 21.46 -

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.