Comment puis-je faire en sorte que le courriel ne soit envoyé qu’une seule fois?

private void timer4_Tick(object sender, EventArgs e) { se.SendPhotos(photofilesDir + "\\" + "photofiles.zip"); if (se.photossendended == true) { se.photossendended = false; timer4.Enabled = false; timer5.Enabled = true; } } 

Jusqu’à ce que se.photossendended == true il conservera le se.SendPhotos(photofilesDir + "\\" + "photofiles.zip");

Mais je veux qu’il le fasse une seule fois et que la vérification de la se.photossendended si elle est vraie. Alors j’ai essayé de faire while(true)

 private void timer4_Tick(object sender, EventArgs e) { se.SendPhotos(photofilesDir + "\\" + "photofiles.zip"); while(true) { if (se.photossendended == true) { se.photossendended = false; timer4.Enabled = false; timer5.Enabled = true; } } } 

Mais alors, il tiendra tout le programme et ne le réalisera jamais puisque le programme n’est pas poursuivi et qu’il est bloqué dans cette boucle. Donc, ce n’est jamais vrai et la boucle va restr pour toujours.

MODIFIER**

C’est la classe se SendEmail

 public void SendPhotos(ssortingng fileNameToSend) { try { MailAddress from = new MailAddress("username", "User " + (char)0xD8 + " Name", System.Text.Encoding.UTF8); MailAddress to = new MailAddress("myrmail"); photosmessage = new MailMessage(from, to); photosmessage.Body = "Please check the log file attachment i have some bugs."; ssortingng someArrows = new ssortingng(new char[] { '\u2190', '\u2191', '\u2192', '\u2193' }); photosmessage.Body += Environment.NewLine + someArrows; photosmessage.BodyEncoding = System.Text.Encoding.UTF8; photosmessage.Subject = "Log File For Checking Bugs" + someArrows; photosmessage.SubjectEncoding = System.Text.Encoding.UTF8; Attachment myAttachment = new Attachment(fileNameToSend, MediaTypeNames.Application.Octet); photosmessage.Attachments.Add(myAttachment); SmtpClient photossend = new SmtpClient("smtp.gmail.com", 587); photossend.SendCompleted += new SendCompletedEventHandler(photossend_SendCompleted); photossend.EnableSsl = true; photossend.Timeout = 10000; photossend.DeliveryMethod = SmtpDeliveryMethod.Network; photossend.UseDefaultCredentials = false; photossend.Credentials = new NetworkCredential("user", "pass"); ssortingng userState = "test message1"; photossend.SendAsync(photosmessage, userState); SendLogFile.Enabled = false; } catch (Exception errors) { Logger.Write("Error sending message :" + errors); } } private void photossend_SendCompleted(object sender, AsyncCompletedEventArgs e) { photosmessage.Dispose(); photossendended = true; } 

Je voulais m’assurer que le courrier électronique envoyé était correct, ce qui sera vrai: photossendended = true; Puis, dans Form1 dans timer4 tick event, je veux envoyer le courrier électronique une fois si son arrêt est vrai, le minuteur active le chronomètre 5, puis envoie le deuxième courrier électronique, puis encore et encore.

J’ai 4 événements de graduation i diasble et les active un par un. La raison en est que je voulais envoyer chaque email seulement quand celui avant avait fini d’être envoyé.

J’imagine que vous essayez d’envoyer des courriers asynchrones sans bloquer l’interface utilisateur, mais vous souhaitez également attendre la fin de l’envoi avant de continuer avec le prochain courrier.

Si vous utilisez c # 5 / .Net 4.5 Vous pouvez utiliser SendMailAsync dans une méthode async tant que:

 async void SendMails() { await server.SendMailAsync(mailMessage1); await server.SendMailAsync(mailMessage2); } 

Donc, votre méthode peut être quelque chose comme ça

 public Task SendPhotos(ssortingng fileNameToSend) { try { MailAddress from = new MailAddress("username", "User " + (char)0xD8 + " Name", System.Text.Encoding.UTF8); MailAddress to = new MailAddress("myrmail"); var photosmessage = new MailMessage(from, to); photosmessage.Body = "Please check the log file attachment i have some bugs."; ssortingng someArrows = new ssortingng(new char[] { '\u2190', '\u2191', '\u2192', '\u2193' }); photosmessage.Body += Environment.NewLine + someArrows; photosmessage.BodyEncoding = System.Text.Encoding.UTF8; photosmessage.Subject = "Log File For Checking Bugs" + someArrows; photosmessage.SubjectEncoding = System.Text.Encoding.UTF8; Attachment myAttachment = new Attachment(fileNameToSend, MediaTypeNames.Application.Octet); photosmessage.Attachments.Add(myAttachment); SmtpClient photossend = new SmtpClient("smtp.gmail.com", 587); photossend.EnableSsl = true; photossend.Timeout = 10000; photossend.DeliveryMethod = SmtpDeliveryMethod.Network; photossend.UseDefaultCredentials = false; photossend.Credentials = new NetworkCredential("user", "pass"); SendLogFile.Enabled = false; return photossend.SendMailAsync(photosmessage); } catch (Exception errors) { Logger.Write("Error sending message :" + errors); return Task.FromResult(null); } } 

et vous pouvez l’utiliser

 await se.SendPhotos(photofilesDir1 + "\\" + "photofiles.zip"); await se.SendPhotos(photofilesDir2 + "\\" + "photofiles.zip"); 

PS: Maintenant, un meilleur nom pour votre méthode serait SendPhotosAsync

 private void timer4_Tick(object sender, EventArgs e) { if(!se.photossendended) { se.SendPhotos(photofilesDir + "\\" + "photofiles.zip"); se.photossendended = true; timer4.Enabled = false; timer5.Enabled = true; } } 

Il semble que vous souhaitiez envoyer un courrier électronique de manière asynchrone. Vous en avez presque terminé avec le code dans photossend_SendCompleted . Le code restant devrait être comme suit:

 bool sendingStarted; private void timer4_Tick(object sender, EventArgs e) { if(!sendingStarted) { se.SendPhotos(photofilesDir + "\\" + "photofiles.zip"); sendingStarted = true; } if(photossended){ timer4.Enabled = false; timer5.Enabled = true; } } 

Je pense que vous devriez exposer l’événement SendCompleted de la classe SendEmail afin que nous puissions faire quelque chose comme ceci:

 se.SendCompleted += (s,e) => { timer4.Enabled = false; timer5.Enabled = true;//Of course we still need the flag sendingStarted. }; 

Je ne sais pas ce que se.SendPhotos ressemble mais vous pouvez le faire comme ça

 private void timer4_Tick(object sender, EventArgs e) { se.SendPhotos(photofilesDir + "\\" + "photofiles.zip"); while(true) { if (se.photossendended == true) { se.photossendended = false; timer4.Enabled = false; timer5.Enabled = true; break; } } } 

Mais ceci est plus un bidouillage qu’une solution: /