117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
1
.NET 4.x

Invoke и новый поток

03.08.2015, 12:14. Показов 967. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь запустить поток, в котором будут изменяться свойства listview. Но судя по зависаниям программы, у меня это не получилось. Вот что я делал:

C#
1
2
3
4
5
6
new Thread(() => listView1.Invoke(new Action(processMail))).Start();
 
void processMail()
{
   // здесь производятся подключения к серверам, довольно объемная операция
}
Что делать?

Да, кстати, безопасен ли такой код? Сборщик мусора справится с ним?
C#
1
2
if((new Form1()).ShowDialog() == OK)
   ...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2015, 12:14
Ответы с готовыми решениями:

Как усыплять дочерний поток реализуя управление элементами из главного потока методом Invoke
как управлять элементами из главного потока в дочернем? Если напишите методом Invoke, то объясните...

Dispatcher.Invoke и delegate invoke, исправить ошибки в коде
привет не пойму почему второй код не работает? void bw_DoWork(object sender, DoWorkEventArgs e)...

Передача в новый поток метода с параметрами
Люди нужен хелп: хочу создавать отдельные потоки для каждого клиента, но не получается их создать,...

Для каждой вкладки с Gecko браузером - новый поток
Создаю приложение в котором есть 5 вкладок, в каждой вкладке Gecko браузер. using System; using...

11
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.08.2015, 13:02 2
Цитата Сообщение от tnk500 Посмотреть сообщение
C#
1
new Thread(() => listView1.Invoke(new Action(processMail))).Start();
Этот код совершенно бессмысленен. Потому что вы создаете новый поток, но тут же возвращаетесь в главный поток через Invoke. Вам нужно сначала делать вычисления (processMail) а потом уже вызывать Invoke.
Цитата Сообщение от tnk500 Посмотреть сообщение
Сборщик мусора справится с ним?
Запросто.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
03.08.2015, 13:19  [ТС] 3
Storm23, делать сначала вычисления? Но как? Вычисления очень взаимодействуют с контролом, поэтому я и не могу вынести в отдельный поток все. Стоп, invoke выполняет делегат в главном потоке, если создан конрол в нем, как это обычно бывает, верно? В чем же смысл этого метода?
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
03.08.2015, 13:23 4
Цитата Сообщение от tnk500 Посмотреть сообщение
Вычисления очень взаимодействуют с контролом
Отделить вычисления от контрола, получить заранее всю необходимую информацию для вычислений и запускать в отдельном потоке. У вас очень сильная связность кода.
0
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
03.08.2015, 13:26 5
Цитата Сообщение от tnk500 Посмотреть сообщение
делать сначала вычисления? Но как?
Окей! Поехали:

Метод processMail с какими данными из listView1 работает? Можно ли эти данные вытащить из listView1 перед обработкой?
0
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.08.2015, 13:27 6
Цитата Сообщение от tnk500 Посмотреть сообщение
делать сначала вычисления? Но как? Вычисления очень взаимодействуют с контролом, поэтому я и не могу вынести в отдельный поток все.
Вычисления должны взаимодействовать с моделью данных а не с контролом. А модель данных время от времени прорисовываться в контролах.
Цитата Сообщение от tnk500 Посмотреть сообщение
Стоп, invoke выполняет делегат в главном потоке, если создан конрол в нем, как это обычно бывает, верно?
Верно.
Цитата Сообщение от tnk500 Посмотреть сообщение
В чем же смысл этого метода?
Смысл в том, что контролы не могут управляться из вторичных потоков. Любое взаимодействие с контролом должно быть в главном потоке. Для этого у контролов существует метод Invoke, который перевызывает свой аргумент в главном потоке.
0
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
03.08.2015, 13:29 7
Из названия метода можно понять, что в listView1 список почтовых ящиков.
Вытащите этот список в обычный List и его используйте в потоке для отправки писем.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
03.08.2015, 13:32  [ТС] 8
kenny69, к этому и стремился. У меня просто "бомбит", когда я использую переменную, без которой можно обойтись. Ладно, несколько string-переменных ничего не испортят...

Добавлено через 2 минуты
LeniumSoft, я хотел, чтобы данные проверялись прямо из контрола, организовывать еще одну практически идентичную коллекцию данных мне ну очень не хотелось. Видимо, концепция языка устроена так, что иного выбора нет
0
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
03.08.2015, 14:00 9
Цитата Сообщение от tnk500 Посмотреть сообщение
концепция языка устроена так
Концепция многопоточности!
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
03.08.2015, 14:18  [ТС] 10
LeniumSoft, да и языка тоже. Хотя, наверно, я оцениваю язык скорее через написанные на нем программы, чем через язык собственно
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
03.08.2015, 15:27 11
Надо стремиться к тому, чтобы контролы использовались лишь для отображения данных, все вычисления должны производится над данными, а не над контролом, к которому они привязаны. Это уменьшит связность кода и цену поддержки таких решений. (Представьте сколько надо переписывать, если вы решите поменять DataGrid на ListView и т.д., а так метод получил DTO, который нужен для расчета и надо будет лишь изменить его заполнение данными)
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
03.08.2015, 16:41  [ТС] 12
kenny69, ну да, согласен.

Разобрался, что такое Invoke. Так что для будущих поколений оставлю объяснение: если вы выполняете некоторые операции в другом потоке, то чтобы изменить свойства некоторых контролов, придется вызывать эту функцию. Ничего особенного она не делает: из другого потока она вызовет определяемую вами функцию, и эту функцию выполнит в том потоке, в котором объект был создан. Поэтому и не будет проблем с потокобезопасностью. И конечно же, работу с контролом, если не хотите нагружать родной для контрола поток, следует минимизировать.
0
03.08.2015, 16:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2015, 16:41
Помогаю со студенческими работами здесь

AsyncCallback: создается ли новый поток на каждое принятое сообщение
Здравствуйте, не совсем понимаю так или не так: Принимаю на сервере сообщения от клиентов вот...

Передать параметр по ссылке в новый поток (REF)
Доброго времени суток, нужен аналог передачи параметра по ссылке при инициализации нового потока...

Не удается организовать новый поток
Добрый день. У меня есть класс для работы с файлами. В какой-то момент я заполняю коллекцию данными...

Как запустить новый поток?
мне надо запустить новый поток как обычно в классе родителя пишу:private Class1 cl; затем после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru