powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ProgressBar на выполнение процедуры отправки почты
25 сообщений из 31, страница 1 из 2
ProgressBar на выполнение процедуры отправки почты
    #34479179
Фотография Super_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть процедура отправки почты:
Код: plaintext
1.
2.
3.
SmtpClient client = new SmtpClient();
Mail.MailMessage mail = new Mail.MailMessage(address_from, address_to); //наше письмо
client.Send(mail); //сама процедура отправки

Письмо отправляется 30-40 сек. Как можно подключить ProgressBar на это действие?
Думаю что тут нужно как-то прикрутить Process...
Кто сталкивался, помогите пожалуйста!
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34479675
Мишаааааааааааааааа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня отправляется 4 секунды иногда быстрей. Но я всё равно не делал прогресс.
Я просто сделал это чудо в потоке, и до тех пор пока не отправилось или не получим результат отправки по эксепшину, кнопка выход из формы не активна. Сама форма в проекте как не модальная.

Тогда и форма не тормозит, тоесть свойство paint хорошо у неё работает и пользователя не напрягает.
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34479785
Фотография Super_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МишааааааааааааааааУ меня отправляется 4 секунды иногда быстрей. Но я всё равно не делал прогресс.
Я просто сделал это чудо в потоке, и до тех пор пока не отправилось или не получим результат отправки по эксепшину, кнопка выход из формы не активна. Сама форма в проекте как не модальная.

Тогда и форма не тормозит, тоесть свойство paint хорошо у неё работает и пользователя не напрягает.

А можеш привести пример как ты это запихнул в поток?
Буду благодарен :)
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34480021
Мишаааааааааааааааа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Super_pА можеш привести пример как ты это запихнул в поток?
Буду благодарен :)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
MailSender ms = new MailSender("smtp.list.ru", 25, "BiLL@list.ru", "password");

Thread mainThread = new Thread(delegate()
{
         this.button1.Enabled = false;                
                
                if (ms.send("XXX@list.com", "This is a test", textBox1.Text)) 
                   MessageBox.Show("Отправилось!");
                else 
                   MessageBox.Show(ms.getErrMsg(), "Информация");

         this.button1.Enabled = true;
}) 

mainThread.Name = "Sending email";
mainThread.Start();            
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34482014
Фотография Super_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34482064
Фотография Super_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опачки!

Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'toolStrip1' не из того потока, в котором он был создан.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Thread mainThread = new Thread(delegate()
                {
                    closeToolStripButton.Enabled = false;  //вот сдесь выдает ошибку!
                    SendMessageForProcess(emails, message, ref mailSend, ref error);
                    closeToolStripButton.Enabled = true;
                });

                mainThread.Name = "Sending email";
                mainThread.Start();
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34482500
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ибо нефиг обращаться к визуальным элементам не из того потока, в котором означенный элемент был создан. аминь.
Миша-а-а наверное в 2003 студии ваяет, раз него такое проканало
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34482519
Фотография Alexes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//Создайте делегат типа:
delegate void SetEnabledDelegate(bool value);
//и метод:
private void SetEnabled(bool value)
{
	closeToolStripButton.Enabled = value;
}
//а затем
Thread mainThread = new Thread(delegate()
                {
                    SetEnabledDelegate dlg = new SetEnabledDelegate(SetEnabled);
                    closeToolStripButton.Invoke(dlg, new object[]{false};
                    SendMessageForProcess(emails, message, ref mailSend, ref error);
                    closeToolStripButton.Invoke(dlg, new object[]{true};
                });

                mainThread.Name = "Sending email";
                mainThread.Start();
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34483122
Фотография Super_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Только вместо
Код: plaintext
closeToolStripButton.Invoke(dlg, new object[]{false};
нужно написать
Код: plaintext
this.Invoke(dlg, new object[]{false};
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34483175
Мишаааааааааааааааа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение индейки Alexes 'a для само развития:
How to: Make Thread-Safe Calls to Windows Forms Controls


Super_P ты её можешь сделать так ;^):

CheckForIllegalCrossThreadCalls Property

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

Thread mainThread = new Thread(delegate()
{
          closeToolStripButton.Enabled = false;  //вот сдесь выдает ошибку!
          SendMessageForProcess(emails, message, ref mailSend, ref error);
          closeToolStripButton.Enabled = true;
});

mainThread.Name = "Sending email";
mainThread.Start();
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34485048
Ginas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мишаааааааааааааааа System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
Ага, удобная штука. Можно использовать многопоточность и в то же время обращаться к элементам формы.
Правда возникает вопрос. Была же какая то веская причина, чтобы запретить по умолчанию такую возможность. Интересно какая.
ЗЫ. С личного опыта. На двухпроцессорных машинах приложение с установленным таким образом свойством имеет дурную привычку время от времени вылетать.
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34485467
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно, сам Мишаа читал ссылку на МСДН, которую он дал?

читаем и думаем.

When a thread other than the creating thread of a control tries to access one of that control's methods or properties, it often leads to unpredictable results. A common invalid thread activity is a call on the wrong thread that accesses the control's Handle property. Set CheckForIllegalCrossThreadCalls to true to find and diagnose this thread activity more easily
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34485912
Мишаааааааааааааааа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читал я всё! :) Для такой задачи в этом нет ничего плохого. Кнопку отрубить. хехе
Не нравиться делайте так как считаете нужным. Это просто один из вариантов. Без уверений что нужно делать так и только так! :)

автор
Была же какая то веская причина, чтобы запретить по умолчанию такую возможность. Интересно какая.


Можно сказать и наоборот: "Была же какая то веская причина, чтобы разрешить использовать такую возможность. Интересно какая?"


Так что прошу не придираться. (Без обид)
Те кому нужно разберутся, почитают и решат что им нужно для своей конкретной задачи. А то так можно было и к майкрософт придраться, мол, "что это вы гоните так, такой брет оставили. Нужно было во втором фреймвёрке запретить эту возможность."
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34485971
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уважаемый Мишааа!!!
тоже прощу без обид. но обращение к свойствам/методам контролов из другого потока чревато самыми неожиданными багами, которые в дальнейшем ОЧЕНЬ трудно выловить.
у вас в отладке может все прокатить раз 500, но на 501 уже у пользователя ваша программа неожиданно начнет работать как-то не так, и поверьте, причину этого найти будет практически невозможно.
Так что не нужно советовать людям заведомо плохие решения.
2 Super_p - воспользуйтесь советом Alexes во избежание больших проблем в будущем.
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #34486053
Мишаааааааааааааааа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас в отладке может все прокатить раз 500, но на 501 уже у пользователя ваша программа неожиданно начнет работать как-то не так, и поверьте, причину этого найти будет практически невозможно.

Спасибо за информацию. Объективно, я с вами соглашусь, так как у меня нет большого опыта работы с потоками и время что бы тестить всё что предлагает мелкасофт. :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ProgressBar на выполнение процедуры отправки почты
    #38049425
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
GinasПравда возникает вопрос. Была же какая то веская причина, чтобы запретить по умолчанию такую возможность
Up
Тоже появилась потребность обращаться к элементам, созданным в другом потоке. Ранее использовал Invoke, а сейчас решил испытать

Код: c#
1.
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;



Пока полет нормальный.
Но про вескую причину может кто-то что-то сказать?
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049465
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
а вы что, релиз под дебагом будете распространять?
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049547
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Где-то в степиCat2,
а вы что, релиз под дебагом будете распространять?
Пробное развертывание проблем не принесло.
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049554
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
Оно и может не принести, ошибка конкурентного доступа может и два три года никак себя не проявлять,
это ж мина замедленного действия, может и пять лет сидеть тихо, это ж для отладки, зачем они эту штуковину придумали, ума не приложу.
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049556
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть же BackgroundWorker, специально для взаимодействия потока с формой
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049564
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Яростный Мечесть же BackgroundWorker, специально для взаимодействия потока с формой
Сам-то его пробовал?
Я попробовал - обыный эксепшен вылетел - "Вы пытаетесь обновить созданное в другом потоке"
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049565
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто скрыли ошибку обращения не из билдер потока.
Представьте что основной поток работает с контролом, планировщик переключат работу на другой поток, основной
не законченное барахло грузит в стек, другой поток работает с котролом, поработал, планировщик возобновляет работу основного потока, он продолжает работать с контролом якобы со старым, хотя он уже не старый последствия не предсказуемы.
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049583
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Решил провести эксперимент.

Таймер запускает поток, который перерисовывает текст на кнопке

Во время дебага вылетает эта ошибка. В откомпилированом релизе - работает.

Прилагаются исходники. Что у меня не так?
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049586
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Яростный Мечесть же BackgroundWorker, специально для взаимодействия потока с формой
Сам-то его пробовал?
Я попробовал - обыный эксепшен вылетел - "Вы пытаетесь обновить созданное в другом потоке"использовал, всё норм.
только к элементам формы надо обращаться в обработчиках ProgressChanged или RunWorkerCompleted
...
Рейтинг: 0 / 0
ProgressBar на выполнение процедуры отправки почты
    #38049594
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Яростный Мечиспользовал, всё норм.
Cat2Во время дебага вылетает эта ошибка. В откомпилированом релизе - работает
Можешь это прокомментировать?
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ProgressBar на выполнение процедуры отправки почты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]