0

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

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
    [Внешний код]

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

Mik
  • 49
  • 1
    Изучите подход к асинхронному выполнению операций в C#: https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/async/ – Zufir Apr 06 '22 at 13:36
  • 2
    this.Invoke((Action)(() => button1.Enabled = true)); – aepot Apr 06 '22 at 13:46

0 Answers0