web-dev-qa-db-fra.com

Avons-nous besoin de supprimer ou de terminer un thread en C # après utilisation?

J'ai le code suivant:

        public static void Send(this MailMessage email)
    {
        if (!isInitialized)
            Initialize(false);
        //smtpClient.SendAsync(email, "");
        email.IsBodyHtml = true;

        Thread mailThread = new Thread(new ParameterizedThreadStart(
            (o) => 
            {
                var m = o as MailMessage;

                SmtpClient client= new SmtpClient("smtpserveraddress");
                client.Send(m);

            }));
        mailThread.Start(email);

Je souhaite que l'envoi du courrier se fasse en arrière-plan sans interférer avec le fil principal. Je m'en fiche quand c'est fini.

Dois-je en quelque sorte gérer la disposition du thread créé (mailThread)? Ou se débarrasse-t-il automatiquement une fois son travail terminé?

Veuillez ne pas recommander la méthode SendAsync. Je voudrais créer le fil manuellement. Mail.Send n'était qu'un exemple de scénario.

Je vous remercie.

32
Aaron Azhari

NON!

il n'est pas nécessaire de supprimer l'objet Thread (ENTRE, la classe Thread ne fournit pas la méthode Dispose).

47
platon

[._________.] Donc NON, vous n'êtes pas obligé de le faire, ce n'est pas nécessaire (ni possible je pense).

8
Marco

Eh bien, votre SmtpClient devrait être Dispose() 'd. J'utiliserais la bibliothèque parallèle de tâches au lieu de créer des threads bruts:

public static void Send(this MailMessage email)
{
    if (!isInitialized)
        Initialize(false);
    //smtpClient.SendAsync(email, "");
    email.IsBodyHtml = true;

    Task.Factory.StartNew(() =>
    {
        // Make sure your caller Dispose()'s the email it passes in at some point!
        using (SmtpClient client = new SmtpClient("smtpserveraddress"))
        {
            client.Send(email);
        }
    });
}
1
Jesse C. Slicer