andycruce Ответов: 1

Ссылка на текстовое поле пользовательского интерфейса из потока с помощью synchronizationcontext


Я работаю с системой GPS, которая предоставляет обновления с помощью метода обратного вызова. Метод обратного вызова находится в другом потоке, чем поток пользовательского интерфейса. Я хочу записать возвращаемые значения в текстовые поля в winform. В приведенном ниже коде я вызываю метод UpdateUI из метода обратного вызова с помощью uiContext.Отправить с uicontext, установленным в потоке пользовательского интерфейса. Однако в методе UpdateUI я не могу получить доступ к элементам пользовательского интерфейса. В WinForm есть только два текстовых поля, но в методе UpdateUI элементы текстового поля LonOutput.text и LatOutput.text не распознаются. Оба эти элементы находятся в общественном. Вот код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Tinkerforge;
using System.Timers;
using System.Threading;

namespace Test_of_GPS_Call_Back
{
    public partial class Form1 : Form
    {
        private static string HOST = "localhost";
        private static int PORT = 4223;
        private static string UID = "CGH";
        public static long gpsLatitude,  gpsLongitude;
        public static SynchronizationContext uiContext;
        static int i = 0;
        public Form1()
        {
            InitializeComponent();
            uiContext = SynchronizationContext.Current;
            IPConnection ipcon = new IPConnection();
            BrickletGPSV2 gps = new BrickletGPSV2(UID, ipcon);
            ipcon.Connect(HOST, PORT);

            gps.CoordinatesCallback += CoordinatesCB;
            gps.SetCoordinatesCallbackPeriod(200);
            
            
         }
 
        static void CoordinatesCB(BrickletGPSV2 sender, long latitude, char ns,
            long longitude, char ew)
        {
            gpsLatitude = latitude;
            gpsLongitude = longitude;
            uiContext.Send(UpdateUI, latitude);

        }
        private static void UpdateUI(object state)
        {
            i++;
            
            

        }
    }
}


когда я ввожу LatOutput. text в методе UpdateUI, он не распознается. Я поместил увеличенное целое число i в UpdateUI только для того, чтобы проверить, что к нему правильно обращаются, и убедиться, что состояние содержит выходные данные gps. В примерах, которые я нашел в интернете, они просто могли напрямую получить доступ к элементам пользовательского интерфейса из этого метода.

Я новичок в этом деле, так что, наверное, мне не хватает чего-то простого.

Что я уже пробовал:

Я попробовал несколько способов доступа к элементам пользовательского интерфейса, но ни один из них не сработал.

1 Ответов

Рейтинг:
2

RickZeeland

Что вам нужно, так это Свойство invokerequired, см. эту статью CP: Избегая InvokeRequired[^]