Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Правильно ли обрабатываю данные на форме из другого потока. / 7 сообщений из 7, страница 1 из 1
19.10.2014, 18:01
    #38781135
maxim111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли обрабатываю данные на форме из другого потока.
Не программист, пишу различную мелочь для автоматизации повседневных задач на работе.
Знаю, что из "другого" потока можно менять значения control'ов через делегаты. С Action связывался ради интересе. Код рабочий, но смузает то, что Action используется дважды. Поправьте если косячнул.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
		private void btn_Click(object sender, EventArgs e)
		{
		var err = new ErrorProvider();
		//Выводим сообщение об ошибке
		err.SetError(btn,"Ошибка");
		// В другом потоке гасим сообщение через 5 сек.
		var myTask= new Task(new Action(() =>
			{
				Thread.Sleep(5000);
				this.BeginInvoke(new Action(() => err.Clear()));
			}));
		myTask.Start();
		}
...
Рейтинг: 0 / 0
20.10.2014, 14:18
    #38781839
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли обрабатываю данные на форме из другого потока.
Нормально работает и без Invoke
Код: c#
1.
2.
3.
4.
5.
var myTask= new Task(new Action(() =>
			{
				Thread.Sleep(5000);
				err.Clear());
			}));



Но по-модному надо так

Код: c#
1.
2.
3.
4.
  Task.Factory.StartNew(() => {
                Thread.Sleep(5000);
                err.Clear(); 
            });
...
Рейтинг: 0 / 0
20.10.2014, 14:40
    #38781865
Ilya81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли обрабатываю данные на форме из другого потока.
Если .Net 4.5, то можно ещё так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
		private async void btn_Click(object sender, EventArgs e)
		{
		var err = new ErrorProvider();
		//Выводим сообщение об ошибке
		err.SetError(btn,"Ошибка");
		// В другом потоке гасим сообщение через 5 сек.
		await Task.Delay(5000);
		err.Clear();
		}



Cat2Нормально работает и без Invoke
Для небольшого приложения можно, но для крупной системы не рекомендую - последовательность вызовов (обновлений пользовательского интерфейса) станет непредсказуемой.
...
Рейтинг: 0 / 0
20.10.2014, 15:06
    #38781910
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли обрабатываю данные на форме из другого потока.
Ilya81,

И чем, по Вашему, Invoke поможет? Просто интересно
...
Рейтинг: 0 / 0
20.10.2014, 15:14
    #38781924
Ilya81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли обрабатываю данные на форме из другого потока.
Cat2Ilya81,

И чем, по Вашему, Invoke поможет? Просто интересно

Можно определить момент завершения обновления элемента пользовательского интерфейса. Если одно сообщение убрать, то какая разница, а вот если приложение побольше со сложным пользовательским интерфейсом (или может таким стать со временем), то появляется возможность управлять тем, в какой последовательности произойдёт обновление нескольких элементов пользовательского интерфейса.
...
Рейтинг: 0 / 0
20.10.2014, 16:04
    #38782006
maxim111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли обрабатываю данные на форме из другого потока.
Cat2Но по-модному надо так

Код: c#
1.
2.
3.
4.
  Task.Factory.StartNew(() => {
                Thread.Sleep(5000);
                err.Clear(); 
            });


Недопустимая операция в нескольких потоках.
...
Рейтинг: 0 / 0
20.10.2014, 16:15
    #38782026
maxim111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильно ли обрабатываю данные на форме из другого потока.
[quot Ilya81]Если .Net 4.5, то можно ещё так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
		private async void btn_Click(object sender, EventArgs e)
		{
		var err = new ErrorProvider();
		//Выводим сообщение об ошибке
		err.SetError(btn,"Ошибка");
		// В другом потоке гасим сообщение через 5 сек.
		await Task.Delay(5000);
		err.Clear();
		}


Форма виснет на 5 секунд, и только потом очищает ErrorProvider
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Правильно ли обрабатываю данные на форме из другого потока. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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