Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/78: Рейтинг темы: голосов - 78, средняя оценка - 4.60
4 / 4 / 0
Регистрация: 13.06.2011
Сообщений: 61

Ошибка доступа из потока к элементам управления

14.09.2011, 09:19. Показов 15895. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа которая загружает в textblock данные полученные по http. Эти данные загружается первый раз при инициализации, но их нужно изменить в процессе выполнения программы. Загрузка данных работает как метод. Я пробовал запустить это метод в отдельный потоке при нажатии на кнопку ОБНОВИТЬ, чтобы форма не висела. Мне выдает ошибку что элементы уже используются в другом потоке. Как быть и как такое обойти?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.09.2011, 09:19
Ответы с готовыми решениями:

Ошибка доступа к элементу управления из другого потока
Код C# namespace DemoIntegral { public partial class Form1 : Form { public Form1() { ...

Ошибка в потоках: Попытка доступа к элементу управления не из того потока, в котором он был создан
Нужно сделать счетчик, и при каждом выполнении потока изменять значение label2.Text

Игра "Жизнь". Ошибка "попытка доступа к элементу управления не из того потока, в котором он был создан"
В 96 строке ошибка. Не могу ее исправить. Помогите, пожалуйста! using System; using System.Collections.Generic; using...

10
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.09.2011, 10:55
http://msdn.microsoft.com/ru-r... cext2.aspx
0
48 / 48 / 8
Регистрация: 26.08.2011
Сообщений: 84
14.09.2011, 14:51
Цитата Сообщение от Destroy2 Посмотреть сообщение
Мне выдает ошибку что элементы уже используются в другом потоке
Визуальные элементы работают в своём UI-потоке, а ваш метод исполняется в другом потоке, а так как визуальные элементы не потокобезопасные то и доступ к ним из других потоков запрещён. Чтобы решить эту проблему все не UI-потоки должны специальным образом обращаться к элементам находящимся в UI-потоке, а точнее добавлять свою задачу в очередь выполнения UI-потока, вот каким образом это делается: у визуального элемента нужно обратиться к свойству Dispatcher и у Dispatcher'а вызывать метод BeginInvoke, который выполнит ваш метод в UI-потоке. Для того чтобы появились дополнительные методы BeginInvoke, работающие с лямбда-выражениями (что очень удобно) надо подключить System.Windows.Presentation.dll.

Пример:

C#
1
textBlock.Dispatcher.BeginInvoke(() => textBlock.Text = "trololo.");
PS: UI - user interface.
1
4 / 4 / 0
Регистрация: 13.06.2011
Сообщений: 61
14.09.2011, 20:22  [ТС]
извиняюсь за г-код, но не подскажете как при моей болезни это лечить?

Мне нужно getDataFromServer(); запускать так чтобы он не тащил в висяк все окно пока завершится http запрос

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using System;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Microsoft.Win32;
using System.Net;
using System.IO;
 
namespace Client
{
    /// <summary>
    /// Логика взаимодействия для msg.xaml
    /// </summary>
    public partial class msg : Page
    {
        public msg()
        {
            InitializeComponent();
 
            
            //создаем поток для чтения сообщений
            //Thread t = new Thread(getDataFromServer);
            //t.SetApartmentState(ApartmentState.STA);
            //t.Start();
            getDataFromServer();
 
 
        }
 
        public void getDataFromServer()
        {
            // name get
            HttpWebRequest registrationReq = (HttpWebRequest)WebRequest.Create(@"http://xxx/first_name.php");
            WebResponse resp = registrationReq.GetResponse();
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string ss = sr.ReadToEnd();
 
            string first_name = ss;
 
 
            List<Names> names = JsonConvert.DeserializeObject<List<Names>>(first_name);
 
 
            Names[] s = names.ToArray();
 
            foreach (Names m in s)
            {
                TextBlock tb = new TextBlock();
                tb.Text = m.first_name + ":";
                tb.TextAlignment = TextAlignment.Center;
                tb.Height = 30;
                tb.Padding = new Thickness(5, 3, 0, 0);
                tb.Background = new ImageBrush(new BitmapImage(new Uri(@"pack://application:,,,/Client;component/Images/mb1.png")));
                stackPanel1.Children.Add(tb);
            }
 
 
            //msgs get
 
            HttpWebRequest registrationReq2 = (HttpWebRequest)WebRequest.Create(@"http://xxx/msg_show.php");
            WebResponse resp2 = registrationReq2.GetResponse();
            Stream stream2 = resp2.GetResponseStream();
            StreamReader sr2 = new StreamReader(stream2);
            string ss2 = sr2.ReadToEnd();
 
            string msgs = ss2;
 
            List<Msg> msgsWriter = JsonConvert.DeserializeObject<List<Msg>>(msgs);
 
            Msg[] msgsWriterArray = msgsWriter.ToArray();
 
 
            foreach (Msg m in msgsWriterArray)
            {
                TextBlock tb2 = new TextBlock();
                tb2.Text = m.msg;
                tb2.Height = 30;
                tb2.Padding = new Thickness(5, 3, 0, 0);
                tb2.Background = new ImageBrush(new BitmapImage(new Uri(@"pack://application:,,,/Client;component/Images/mb.png")));
                stackPanel2.Children.Add(tb2);
            }
 
        }
 
 
 
        private void button1_Click(object sender, RoutedEventArgs e)
        {
 
            //get login from reg
            RegistryKey readKey = Registry.CurrentUser.OpenSubKey("software\\xx");
            string login = (string)readKey.GetValue("first_name");
 
            msg_add(login, textBox1.Text, "solaris");
            textBox1.Text = "";
        }
 
 
        public void msg_add(string login, string msg, string server)
        {
            HttpWebRequest registrationReq = (HttpWebRequest)WebRequest.Create(@"http://xxx/msg_add.php?login=" + login + "&msg=" + msg + "");
            WebResponse resp = registrationReq.GetResponse();
            Stream stream = resp.GetResponseStream();
            //очищение чата и заполнение
            stackPanel2.Children.Clear();
            stackPanel1.Children.Clear();
            getDataFromServer();
 
        }
 
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            //reload
            //cl чата и заполнение
            stackPanel2.Children.Clear();
            stackPanel1.Children.Clear();
 
            getDataFromServer();
            
        }
 
 
 
 
 
    }
}
0
48 / 48 / 8
Регистрация: 26.08.2011
Сообщений: 84
14.09.2011, 20:42
Цитата Сообщение от Destroy2 Посмотреть сообщение
запускать так чтобы он не тащил в висяк все окно пока завершится http запрос
Пользователь iva_a дал вам ссылку где описывается BackgroundWorker, который как раз должен решить вашу проблему. Для понятности приведу пример использования:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.ComponentModel;
 
class Program
{
    static void Main()
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerCompleted += bw_RunWorkerCompleted;
        bw.RunWorkerAsync();
    }
 
    // Этот метод вызывается при завершении работы фонового потока.
    // Можете использовать этот метод например для отображения на
    // форме данных, загруженных из интернета. 
    static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //
    }
 
    // Этот метод запускается при запуске BackgroundWorker.
    static void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        // Тут выполняете ваш код, который "тащит в висяк" вашу форму.
    }
}
То есть, выполняете ваш код, который нагружает систему, в фоновом потоке и после завершения этого кода выгружаете изменения на форму.
0
4 / 4 / 0
Регистрация: 13.06.2011
Сообщений: 61
14.09.2011, 20:51  [ТС]
так я прочитал и сделал так, но вылазит ошибка Вызывающим потоком должен быть STA, поскольку этого требуют большинство компонентов UI.

Поток лечил этим t.SetApartmentState(ApartmentState.STA); , а тут как быть не знаю

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 //создаем поток для чтения сообщений
            //Thread t = new Thread(getDataFromServer);
            //t.SetApartmentState(ApartmentState.STA);
            //t.Start();
            BackgroundWorker _backgroundWorker = new BackgroundWorker();
            _backgroundWorker.DoWork += _backgroundWorker_DoWork;
            _backgroundWorker.RunWorkerAsync(5000);
            //getDataFromServer();
 
 
        }
 
 
        void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            getDataFromServer();
        }
1
48 / 48 / 8
Регистрация: 26.08.2011
Сообщений: 84
14.09.2011, 21:14
Destroy2, в коде метода getDataFromServer(), а именно там где идёт обращение к визуальным элементам пишите вот так:

C#
1
2
textBlock.Dispatcher.BeginInvoke(() => textBlock.Text = "Your text.");
stackPanel.Dispatcher.BeginInvoke(() => stackPanel.Children.Add(textBlock));
То есть обращайтесь к каждому контролу через свойство Dispatcher и метод BeginInvoke, а уже в методе BeginInvoke пишете ваше лямбда-выражение, которое делает то что вы хотите.
0
4 / 4 / 0
Регистрация: 13.06.2011
Сообщений: 61
14.09.2011, 21:20  [ТС]
Цитата Сообщение от lambda Посмотреть сообщение
Destroy2, в коде метода getDataFromServer(), а именно там где идёт обращение к визуальным элементам пишите вот так:

C#
1
2
textBlock.Dispatcher.BeginInvoke(() => textBlock.Text = "Your text.");
stackPanel.Dispatcher.BeginInvoke(() => stackPanel.Children.Add(textBlock));
То есть обращайтесь к каждому контролу через свойство Dispatcher и метод BeginInvoke, а уже в методе BeginInvoke пишете ваше лямбда-выражение, которое делает то что вы хотите.
Ошибка 12 Невозможно преобразовать "лямбда-выражение" к типу "System.Delegate", поскольку он не является делегатом D:\Client\Client\Client\msg.xaml.cs 70 52 Client (
0
48 / 48 / 8
Регистрация: 26.08.2011
Сообщений: 84
14.09.2011, 21:22
Цитата Сообщение от Destroy2 Посмотреть сообщение
Ошибка 12 Невозможно преобразовать "лямбда-выражение" к типу "System.Delegate", поскольку он не является делегатом D:\Client\Client\Client\msg.xaml.cs 70 52 Client (
Читайте мои посты внимательнее, я до этого писал:

Цитата Сообщение от lambda Посмотреть сообщение
Для того чтобы появились дополнительные методы BeginInvoke, работающие с лямбда-выражениями (что очень удобно) надо подключить System.Windows.Presentation.dll.
1
4 / 4 / 0
Регистрация: 13.06.2011
Сообщений: 61
14.09.2011, 21:39  [ТС]
Цитата Сообщение от lambda Посмотреть сообщение
Читайте мои посты внимательнее, я до этого писал:
добавил в сборку, но в using что то не кидается это пространство имен

Добавлено через 4 минуты
C#
1
stackPanel1.Dispatcher.BeginInvoke(() => stackPanel1.Children.Add(tb));
все равно жалуется что хозяин другой поток
0
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
07.06.2012, 21:35
C#
1
image1.Dispatcher.BeginInvoke(() => image1.Source = im);
Невозможно преобразовать "лямбда-выражение" к типу "System.Delegate", поскольку он не является делегатом
Что не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2012, 21:35
Помогаю со студенческими работами здесь

BackgroundWorker: попытка доступа к элементу управления не из того потока
Здравствуйте. Прошу помочь разобраться с BackgroundWorker. Только начинаю знакомство с этим языком и всеми его возможностями, поэтому...

Сокеты, ошибка доступа к элементу управления из потока
Здравствуйте. Такая проблема: использую сокеты для передачи текстовой информации, после получения, при попытке вывести на форму в текстовое...

Ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "richTextBox1" не из того потока, в котором он был создан."
Код клиента: public partial class Form1 : Form { string IP; string Port; Socket socket; ...

Попытка доступа к элементу управления не из того потока, в котором он был создан
Здравствуйте, уважаемые знатоки. Помогите, плиз, с задачкой. Иначе я сломаю комп до того, как он сломает мне мозг ))) Почему-то...

Com port попытка доступа к элементу управления не из того потока, в котором он был создан
попытка доступа к элементу управления 'label2' не из того потока, в котором он был создан. Собственно, впытаюсь получить значения с ком...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru