SMTPclient в c# отправка в потоке

Подскажите пожалуйста как сделать следующее. По нажатию кнопки я запускаю функцию отправки почты. Письма успешно отправляются. Но если я нажму кнопку, то программа "зависнет" пока не отправит письмо. Я сделал отдельный поток для отправки почты:

Thread Mail = new Thread(new ThreadStart(Mailer));
        Mail.Start();

Теперь программа отправляет письма и не "виснет". Но появляется новая проблема. Если нажму на кнопку специально или случайно несколько раз, то столько раз отправится письмо. А это не нужно.

Я добавил код блокировки кнопки:

   Thread Mail = new Thread(new ThreadStart(Mailer));
        button1.Enabled = false;
        Mail.Start();

А в try catch отправки письма:

            finally
        {
            toolStripStatusLabel1.Text = "Письмо отправлено";
            button1.Enabled = true;

        }

В итоге программа ловит исключение:

    System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'button1' не из того потока, в котором он был создан."
Изначально это исключение было создано в этом стеке вызовов: 
    [Внешний код]
    WindowsFormsApp1.Form1.Mailer() в Form1.cs
    [Внешний код]

Как можно сделать грамотно?


Ответы (0 шт):