Threading [C#]

giovedì 19 maggio 2011 - 18.09
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows XP  |  Visual Studio 2010  |  Office 2003  |  Internet explorer 8.0

Jigen79 Profilo | Newbie

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

>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

cosa intendi per
un metodo standard è quello di usare la struttura già prevista?
mi puoi fare un'esempio?

StefanoRicci Profilo | Junior Member

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

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

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
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5