Непонятки с потоками (попытка доступа к элементу управления не из того потока, в котором он был создан) - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте коллеги. Подскажите пожалуйста, как реализовать вывод на форму информации записанной в регистрах устройства, подключенного к последовательному порту компьютера. На данный момент я могу при помощи готового кода реализовать чтение только одного регистра и вывод его на форму. При попытке вывести хотя бы два, при запуске приложения возникает ошибка потоков. Для вывода одного использую этот код:
  #region GUI Объявление делегатов
        public delegate void GUIDelegate(string paramString);
        public delegate void GUIClear();
        public delegate void GUIStatus(string paramString);
  #endregion

        #region Функции делегатов
        public void DoGUIClear()
        {
            if (this.InvokeRequired)
            {
                GUIClear delegateMethod = new GUIClear(this.DoGUIClear);
                this.Invoke(delegateMethod);
            }
            else
               
            this.Indication1.Items.Clear();
            
        }
        public void DoGUIStatus(string paramString)
        {
            if (this.InvokeRequired)
            {
                GUIStatus delegateMethod = new GUIStatus(this.DoGUIStatus);
                this.Invoke(delegateMethod, new object[] { paramString });
            }
            else
                this.lblStatus.Text = paramString;
        }
        public void DoGUIUpdate(string paramString)
        {
            if (this.InvokeRequired)
            {
                GUIDelegate delegateMethod = new   GUIDelegate(this.DoGUIUpdate);
                this.Invoke(delegateMethod, new object[] { paramString });
            }
            else
                
                this.Indication1.Items.Add(paramString);
        }
        #endregion
Сначала думал что достаточным будит добавить в этом коде строчки например:
this.Indication2.Items.Add(paramString)
однако нет)) Как быть пока не знаю…может кто чем сможет помоч. Заранее спасибо.

Решение задачи: «Непонятки с потоками (попытка доступа к элементу управления не из того потока, в котором он был создан)»

textual
Листинг программы
public void DoGUIUpdate(string paramString)
        {
            // Это свойство показывает, что метод нужно вызывать через инвок, т.к. контрол находится в другом потоке
            if (this.InvokeRequired)
            {
                // Создаем делегат для метода DoGUIUpdate
                GUIDelegate delegateMethod = new GUIDelegate(this.DoGUIUpdate);
                // Вызываем делегат delegateMethod
                this.Invoke(delegateMethod, new object[] { paramString });
            }
            else
                
                this.Indication1.Items.Add(paramString);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы