Come da consiglio di Diego ho studiato e implementato il BackgroundWorker. E' sostanzialmente semplice e poi su internet si trovano molti esempi su come fare. L'implementazione è andata a buon fine e l'applicazione funziona. Ho due domande:
1) Nella vecchia versione dell'applicazione (cioè unico thread senza BGW) mettevo il cursore a Wait prima di lanciare la parte "lunga" e al termine di questa lo rimettevo a Default. Ora ho messo Cursor.Current=Cursors.WaitCursor nella routine che lancia bgw.RunWorkerAsync(Arguments) e il Cursor.Current=Cursors.Default nell'evento bgw_RunWorkerCompleted ma non funziona; il cursore non diventa wait nemmeno per un momento. Esiste qualche barbatrucco per farlo funzionare?
2) La documentazione del BGW dice che non si deve fare riferimento ai controlli all'interno della procedura che usa il thread separato; nelle routine (di libreria DLL) che uso nell'applicazione per la gestione dell'estrazione dati dal DB ho messo delle MessageBox per visualizzare eventuali errori che si possono verificare sul DB. La comparsa della MessageBox durante l'esecuzione in background è possibile oppure anche questa può dare l'errore di IllegalThread...? L'errore viene comunque gestito e torna indietro sino a dove mi interessa farlo arrivare quindi posso cancellare l'operazione in background con il parametro dedicato di BGW ma la MessageBox resta a livello di libreria.
Grazie per tutti i chiarimenti
Stefano