Подскажите пожалуйста как сделать следующее. По нажатию кнопки я запускаю функцию отправки почты. Письма успешно отправляются. Но если я нажму кнопку, то программа "зависнет" пока не отправит письмо. Я сделал отдельный поток для отправки почты:
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
[Внешний код]
Как можно сделать грамотно?
this.Invoke((Action)(() => button1.Enabled = true));– aepot Apr 06 '22 at 13:46