Threading e Delegati [C#]

mercoledì 15 aprile 2009 - 20.45

Luk3 Profilo | Newbie

Hola.
Sto facendo un programma per l'invio di mail. Durante l'invio però, questo si blocca e non risponde per un po'.
Ho chiesto consiglio su come risolvere il problema, e mi hanno detto di gestire l'invio in un thread separato..
Qualcuno saprebbe dirmi come devo fare?

Specifico che sto sviluppando in WPF.. Ho usato un codice del genere:

using System.Threading; Thread myThread = new Thread(new ThreadStart(SendMail)); t.Start();

Ma mi da un'eccezione sull'IF che controlla se le textbox sono vuote:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Spero di essere stato chiaro, altrimenti ditemi pure, cercherò di spiegarmi al meglio

luigidibiasi Profilo | Guru

Il problema nasce dal fatto che vuoi accedere alla textbox creata da un thread X da un altro thread Y. Per semplificare il tutto puoi dichiarare due variabili globali di tipo textbox e farle puntare alle textbox da controllare.

(stessa cosa per la progressbar ti darà errore anche li)

Piu in dettaglio

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/

Luk3 Profilo | Newbie

Ho fatto come hai detto tu, ma continua a darmi errore nello stesso punto..
Questo è il mio codice adesso:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

luigidibiasi Profilo | Guru

L'errore è sul primo if?
Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/

Luk3 Profilo | Newbie

Si

aiedail92 Profilo | Expert

Ciao

Luigi, la tua soluzione non è comunque corretta, non basta avere delle variabili globali perché l'eccezione di Cross-Threading viene lanciata quando si accede ad un controllo da un thread diverso da quello che l'ha creato. Pertanto, se i controlli vengono creati dal thread principale, anche se salvi le variabili in ambito globale, quando accedi dall'altro thread avrai l'eccezione.

Quello che devi fare in realtà è invocare un delegato sul thread principale che si occupi di modificare i controlli:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Con le modifiche che ho fatto, per eseguire l'invio dell'email basta che chiami la funzione Invia, la quale si preoccupa di fare i controlli di validazione, di ottenere i parametri da passare all'altro thread (funzione invio) e quindi di avviarlo. Il thread quando deve accedere ai controlli lo fa attraverso il metodo Invoke per eseguirli sul thread corretto. Se qualcosa non dovesse ancora andare, fammi sapere

P.S. Ti consiglio, per migliorare la pulizia del codice e la leggibilità, di rinominare i controlli con dei nomi più significativi, ti assicuro che aumenta anche la produttività (è più facile ricordare un nome descrittivo che il numero del controllo)

Luca

luigidibiasi Profilo | Guru

Controllare prima e dopo lanciare il thread...!!!!!


Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/

Luk3 Profilo | Newbie

Ora funziona perfettamente, grazie
Però, l'email non mi arriva xD
Cioè ho utilizzato lo stesso codice che avevo usato in un altro programma, ma qui le mail non arrivano O.O

aiedail92 Profilo | Expert

Ciao

Prova a verificare in debug che l'esecuzione passi effettivamente sulle righe di codice per l'invio dell'email...

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5