Torna al Thread
public void Invia()
{
//Prima di avviare il nuovo thread, fa tutti i controlli
if (textBox1.Text.Length == 0 && textBox2.Text.Length == 0)
{
MessageBox.Show("Please Fill The \"From\" and The \"To\" Field.", "Missing", MessageBoxButton.OK, MessageBoxImage.Exclamation);
return;
}
if (textBox1.Text.Length == 0)
{
MessageBox.Show("Please Fill The \"From\" Field.", "Missing", MessageBoxButton.OK, MessageBoxImage.Exclamation);
return;
}
if (textBox2.Text.Length == 0)
{
MessageBox.Show("Please Fill The \"To\" Field.", "Missing", MessageBoxButton.OK, MessageBoxImage.Exclamation);
return;
}
//Imposta i valori
progressBar1.Value = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = Convert.ToInt32(comboBox2.SelectedItem);
this.Title = "UFO Mail - Sending...";
this.Cursor = Cursors.Wait;
//Crea il Thread
Thread thd = new Thread(new ParameterizedThreadStart(invio));
//Crea i parametri da passare al thread (per non avere eccezioni di cross-thread)
object[] parameters = new object[] {
comboBox2.SelectedItem,
textBox1.Text,
textBox2.Text,
textBox3.Text,
richTextBox1.Document.ToString(),
comboBox1.SelectedItem
};
//Avvia il thread separato
thd.Start(parameters);
}
private void invio(object obj)
{
object[] param = (object[])obj;
int nom = Convert.ToInt32(param[0]);
//Questo delegato (metodo anonimo) incrementa il valore della progressbar
Action<int> incVal = delegate(int n)
{
progressBar1.Value++;
if (progressBar1.Value == n)
{
MessageBox.Show("message Sent!", "Sent", MessageBoxButton.OK, MessageBoxImage.Information);
progressBar1.Value = 0;
}
};
for (int i = 0; i <= nom; i++)
{
try
{
MailMessage Msg = new MailMessage();
Msg.From = new MailAddress((string)param[1]);
Msg.To.Add(new MailAddress((string)param[2]));
Msg.Subject = (string)param[3];
Msg.Body = (string)param[4];
Msg.IsBodyHtml = true;
SmtpClient Smtp = new SmtpClient((string)param[5]);
Smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
NetworkCredential Credential = new NetworkCredential();
Smtp.UseDefaultCredentials = false;
Smtp.Credentials = Credential;
Smtp.Send(Msg);
//Incrementa il valore della progressbar sul thread a cui appartiene
progressBar1.Dispatcher.Invoke(incVal, nom);
}
catch (Exception ex)
{
MessageBox.Show("Houston, We Have a Problem!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
break;
}
}
//Questo codice verrà eseguito sul thread a cui appartengono i controlli
ThreadStart act = delegate()
{
this.Title = "UFO Mail";
this.Cursor = Cursors.Arrow;
progressBar1.Value = 0;
};
//Controlla se siamo sul thread dei controlli o su un altro
if (this.Dispatcher.CheckAccess())
{
//Se siamo su quello dei controlli, chiama il delegato normalmente
act.Invoke();
}
else
{
//Altrimenti invoca il delegato sul thread corretto
this.Dispatcher.Invoke(act, null);
}
}