Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Threading [C#]
giovedì 19 maggio 2011 - 18.09
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
C#
|
.NET 4.0
|
Windows XP
|
Visual Studio 2010
|
Office 2003
|
Internet explorer 8.0
Jigen79
Profilo
| Newbie
3
messaggi | Data Invio:
gio 19 mag 2011 - 18:09
Sto sviluppando un programma che invia una lista di mail a diversi mittenti. Ho usato Backgroungworker per non bloccare l'interfaccia con l'utente, ma vorrei (capire) ed usare i thread in modo esplicito.
Un altro dubbio è su come accedere e passare dati da un thread all'altro (principale).
Qualcuno puo aiutarmi?
StefanoRicci
Profilo
| Junior Member
103
messaggi | Data Invio:
gio 19 mag 2011 - 18:16
>Sto sviluppando un programma che invia una lista di mail a diversi
>mittenti. Ho usato Backgroungworker per non bloccare l'interfaccia
>con l'utente, ma vorrei (capire) ed usare i thread in modo esplicito.
>Un altro dubbio è su come accedere e passare dati da un thread
>all'altro (principale).
>Qualcuno puo aiutarmi?
>
per usarli in modo esplicito, basta che allochi le classi presenti nel .net...
per quel che riguarda il passaggio dati, dipende come lo vuoi fare te.... un metodo standard è quello di usare la struttura già prevista, l'altro è creare te la classe thread che nel costruttore prevede il passaggio di quello che ti serve
se cerchi informazioni è tutto spiegato in modo completo nella msdn
qqui trovi un esempio:
http://msdn.microsoft.com/it-it/library/7a2f3ay4
(v=VS.90).aspx
--------------------------------------
IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express
Jigen79
Profilo
| Newbie
3
messaggi | Data Invio:
gio 19 mag 2011 - 18:28
cosa intendi per
un metodo standard è quello di usare la struttura già prevista?
mi puoi fare un'esempio?
StefanoRicci
Profilo
| Junior Member
103
messaggi | Data Invio:
gio 19 mag 2011 - 18:34
standard intendo che usi il metodo già presente per dire al thread di partire con quel parametro, senza creare tu una classe apposta che poi va istanziata e lanciata..
per capirci, in genere lanci u thread usando come riferimento un metodo magari già presente nella classe che stai usando al momento...
quindi il max che fai è passare il parametro al metodo....
nel caso della creazione della classe appositamente istanziata per questo scopo, hai un livello di gestione diverso, ma con cui devi fare un pò più di codice....
dipende tutto da quello che devi scrivere tu
--------------------------------------
IDE: Visual Studio 2008 Professional Edition
IDE: Visual Studio 2010 Express
Jigen79
Profilo
| Newbie
3
messaggi | Data Invio:
gio 19 mag 2011 - 18:46
ti posto il codice della funzione SendMail che invia la mail.
Attualmente la lancio (e gli passo i parametri) da un ciclo for (con Backgroundworker) per inviare tutte le mail.
Il problema e che devo modificare delle variabili sul thread principale e rilasciare le risorse dall'evento Client_OnCompleted.
Mi puoi dare qualche dritta?
// INVIA MAIL
private bool SendMail(string To, string Attachment, int Index, BackgroundWorker worker, DoWorkEventArgs e)
{
//Se e stata effettuata la richiesta di annullamento del processo annullo l'invio
if (worker.CancellationPending)
{
e.Cancel = true;
//Assegno il progresso dell'invio Mail come percentuale del totale
percentComplete = (100);
worker.ReportProgress(percentComplete);
return false;
}
else
{
MailMessage Messaggio = new MailMessage();
SmtpClient Client = new SmtpClient();
// Inizializzo "Messaggio" con i vari campi e "Client" con Server e Port
Messaggio.From = new MailAddress(IndirizzoMittente, NomeMittente);
Messaggio.To.Add(new MailAddress(To));
Messaggio.Subject = OggettoMail;
Messaggio.Body = TestoMail;
// Inizializzo "Client" con Server e Port
Client = new SmtpClient(Server, Port);
if ((bool)Autenticazione == true)
{ //Inizializzo le credenziali per l'accesso con Username e Passsword
Client.UseDefaultCredentials = false;
Client.Credentials = new NetworkCredential(Username, Password);
}
else
{ //Accesso al server senza Username e Password
Client.UseDefaultCredentials = true;
}
// Assegno i valori a SSL e Timeout
Client.EnableSsl = SSL;
Client.Timeout = TimeOut;
Client.DeliveryMethod = SmtpDeliveryMethod.Network;
//Inizializzo "Allegato" e "Disposizioni" con i parametri dell'allegato da inviare
Attachment Allegato = new Attachment(Attachment, MediaTypeNames.Application.Octet);
ContentDisposition Disposizioni = Allegato.ContentDisposition;
Disposizioni.CreationDate = System.IO.File.GetCreationTime(Attachment);
Disposizioni.ModificationDate = System.IO.File.GetLastWriteTime(Attachment);
Disposizioni.ReadDate = System.IO.File.GetLastAccessTime(Attachment);
Disposizioni.DispositionType = DispositionTypeNames.Attachment;
Messaggio.Attachments.Add(Allegato);
object IndexMessaggio = Index;
Client.SendCompleted += new SendCompletedEventHandler(Client_OnCompleted);
mailSent = false;
//Invio il messaggio
Client.SendAsync(Messaggio, Index);
if (mailSent == true)
{
//rilascio le risorse
Messaggio.Dispose();
}
return (true);
}
}
public static void Client_OnCompleted(object sender, AsyncCompletedEventArgs e)
{
//Get the Original MailMessage object
MailMessage mail = (MailMessage)e.UserState;
//write out the subject
string subject = mail.Subject;
if (e.Cancelled)
{
// StatoInvioMail[sender] = "Annullato";
}
if (e.Error != null)
{
/* if (e.Error.InnerException == null)
{
StatoInvioMail[Index] = "Errore : " + e.Error.Message;
}
else
{
StatoInvioMail[Index] = "Errore : " + e.Error.InnerException.Message;
}
//rilascio le risorse
Messaggio.Dispose();
FlagStatoMail[Index] = "false";
//Assegno il progresso dell'invio Mail come percentuale del totale
percentComplete = (int)((float)(Index + 1) / (float)PercorsoAllegatoMail.Count * 100);
worker.ReportProgress(percentComplete);
*/
mailSent = true;
}
else
{
/* //rilascio le risorse
Messaggio.Dispose();
StatoInvioMail[Index] = "Inviato";
FlagStatoMail[Index] = "true";
RemainsMail--;
//Assegno il progresso dell'invio Mail come percentuale del totale
percentComplete = (int)((float)(Index + 1) / (float)PercorsoAllegatoMail.Count * 100);
worker.ReportProgress(percentComplete);
*/
mailSent = true;
}
}
}
}
whiteflash
Profilo
| Junior Member
83
messaggi | Data Invio:
gio 19 mag 2011 - 19:31
mmh operazioni mulithreading... se googli ci sono molti tutorial
questo è uno:
http://www.codersource.net/microsoft-net/c-basics-tutorials/c-net-tutorial-multithreading.aspx
attento alle eccezioni che potrebbe mandarti in crash l'app
---------------------------------------------
Newbie esperto VB.NET 2010 e WPF
Torna su
Stanze Forum
Elenco Threads
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 !