Установка текста метки из данных вне цепочки с помощью .Net Compact / Windows CE - PullRequest
0 голосов
/ 12 июня 2018

Не могу найти надежного источника информации о том, как это сделать.Разбивка того, что я делаю.У меня работает сервер / клиент, который работает в потоке.Как только информация получена, мне нужно поместить эту информацию в этикетку.

Чтобы быть полностью понятным, сообщение, которое я хочу отобразить в ярлыке.

Код из моего класса прослушивания:

        public void receiveMessage(IAsyncResult ar)
    {
        //read from client
        int bytesRead;
        try
        {
            lock (_client.GetStream())
            {
                bytesRead = _client.GetStream().EndRead(ar);
                //Console.WriteLine(ASCIIEncoding.ASCII.GetString(data, 0, bytesRead));
            }
            //if client has disconnected
            if (bytesRead < 1)
                return;
            else
            {
                //get the message sent
                string messageReceived =
                    ASCIIEncoding.ASCII.GetString(data, 0, bytesRead);   
                if (frmMain.InvokeRequired)
                {
                    frmMain.UpdateData(messageReceived);
                }
            }
            //continue reading from client
            lock (_client.GetStream())
            {
                _client.GetStream().BeginRead(
                    data, 0, _client.ReceiveBufferSize,
                    receiveMessage, null);

            }
        }
        catch (Exception ex)
        {

        }
    }

Код из frmMain.UpdateData:

        public void UpdateData(string text)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action<string>(UpdateData), new object[] { text });
            return;
        }
        stat_bar.Text = text;
    }

Это прекрасно работает в обычном настольном приложении win form.Но мне нужно, чтобы что-то работало в рамках WindowsCE / .NetCompact.

1 Ответ

0 голосов
/ 22 июня 2018

Чтобы обновить элемент GUI из другого потока, не являющегося GUI, вам необходимо использовать Delegate и Invoke.Я всегда использую этот шаблон:

    delegate void SetTextCallback(string text);
    public void addLog(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.txtLog.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(addLog);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            if (txtLog.Text.Length > 2000)
                txtLog.Text = "";
            txtLog.Text += text + "\r\n";
            txtLog.SelectionLength = 0;
            txtLog.SelectionStart = txtLog.Text.Length - 1;
            txtLog.ScrollToCaret();
        }
    }

Вы можете сделать это со всеми типами аргументов и элементов.

...