0 / 0 / 0
Регистрация: 13.02.2009
Сообщений: 3
|
||||||
1 | ||||||
Обращение к элементу WinForms из потока, отличного от потока, в котором это элемент был создан28.03.2010, 18:31. Показов 13796. Ответов 3
Метки нет (Все метки)
Пишу приложение, котором при загрузке формы в textbox на этой форме заносятся данные. Причем данных много и процесс занимает длительное время. Чтобы при запуске у пользователя не возникало ощущения, что форма "подвисла" сделал заполнение textbox в отдельном потоке. Реализовал через асинхронный делегат, в упрощенном виде можно представить программу так:
Почитал на MSDN про потокобезопасные вызовы, однако оба предложенных там потокобезопасных способа приводят к выполнению функции TakesAWhile в главном потоке и соответственно "подвисанию" формы. Пришлось отключить сообщение об ошибке с помощью Код
Control.CheckForIllegalCrossThreadCalls = false Вопросы на повестке дня: 1)Насколько "хорошо" использование данного решения? 2)Есть ли другие потокобезопасные способы без "подвисания" формы (догадываюсь, что нет, т.к. textbox создан в главном потоке, но вдруг)? 3)Созданный BeginEnvoke дополнительный поток завершится после выполнения функции TakesAWhile или как? И для чего тогда нужен метод EndEnvoke? Заранее огромное спасибо.
0
|
28.03.2010, 18:31 | |
Ответы с готовыми решениями:
3
Доступ к элементу управления не из того потока, в котором он был создан Попытка доступа к элементу не из того потока, в котором он был создан Попытка доступа к элементу управления не из того потока, в котором он был создан Ошибка доступ к элементу ProgressBar не из того потока, в котором он был создан |
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
|
|||||||||||
29.03.2010, 16:35 | 2 | ||||||||||
1) плохо. надо хотя бы так
2) явно подвисать сможет если мой BeginInvoke изменить на Invoke, а в теле chTxt поставить что-то типа Thread.Sleep(1000); 3) да, завершится. EndEnvoke - это дань моде асинхронной модели программирования .NET . вызвав этот метод по завершении отработки делегата контекст этого созданного потока уходит в контекст синхронизации потока вызова, а, следовательно, можно к примеру получить результат выполнения асинхронного метода, его состояние, или отловить закэшированное в том потоке исключение. (разрушенный стек и пр.) Добавлено через 4 минуты или так:
0
|
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
|
|
29.03.2010, 17:30 | 3 |
bairog, используйте контрол BackgroundWorker. В нем уже все реализовано.
Подписываетесь на события: DoWork - длительный рабочий код, ProgressChanged - изменяем форму в соответсвии с процентом выполнения рабочего кода, RunWorkerCompleted - процесс закончен.
0
|
5 / 5 / 0
Регистрация: 01.02.2010
Сообщений: 98
|
|
29.03.2010, 19:45 | 4 |
В GUI приложениях EndEnvoke не обязатателен. Лично я считаю, что лучше использовать отдельный поток (Thread) для длительных вычислений и выводить на форму по примеру Mikant. BackgroundWorker хорош, когда нужно вычислить что-либо в отдельном потоке и вывести это что-то в форму когда RunWorkerCompleted, более того, при старте BW возможно передать только один объект (при старте потока с использованием Thread можно передать несколько объектов). По поводу ProgressChanged - если честно то я так и не разобрался как, например, с его использованием производитьманипуляции с элементами формы, например , выводить текстовую информацию ... возможно он используется только для таких целей :-):
progressBar.Value = e.ProgressPercentage;
0
|
29.03.2010, 19:45 | |
29.03.2010, 19:45 | |
Помогаю со студенческими работами здесь
4
Попытка доступа к элементу управления 'label2' не из того потока, в котором он был создан Попытка доступа к элементу управления Label1 не из того потока в котором он был создан Com port попытка доступа к элементу управления не из того потока, в котором он был создан Непонятки с потоками (попытка доступа к элементу управления не из того потока, в котором он был создан) BackgroundWorker. Как получить доступ к элементу управления не из того потока, в котором он был создан Многопоточность. Попытка доступа к элементу управления 'listBox1' не из того потока, в котором он был создан Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |