C # WPF UDP-сообщение в реальном времени

#c# #wpf #udp

#c# #wpf #udp

Вопрос:

Я действительно новичок в C # с WPF, я пытаюсь написать программу для отображения UDP-сообщения в реальном времени (в основном просто значения), однако я не могу включить код прослушивания UDP в свой код c # для WPF, у него нет всплывающего окна, если я использую функцию прослушивания UDPкак я и делал, есть идеи, как это сделать? Действительно ценю!

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;

//UDP
using System.Net;
using System.Net.Sockets;


namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        string Rawdata_str1 = "0";

        public MainWindow()
        {
            InitializeComponent();
            UDP_listening_PI1();
            X_values.DataContext = new X_Y() { X = Rawdata_str1 };
            Y_values.DataContext = new X_Y() { Y = Rawdata_str1 };
        }

        public void UDP_listening_PI1()
        {
            UdpClient listener = new UdpClient(48911);
            IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, (48911));
            bool done = false;
            try
            {
                while (!done)
                {
                    byte[] pdata = listener.Receive(ref groupEP);
                    string price = Encoding.ASCII.GetString(pdata);
                    int Rawdata1 = int.Parse(price);
                    Rawdata_str1 = Rawdata1.ToString();
                }
            }

            finally
            {
                listener.Close();
            }
        }
    }

    public class X_Y
    {
        public string X { get; set; }
        public string Y { get; set; }
    }

}
  

Ответ №1:

Вы прослушиваете UDP-порт в главном потоке пользовательского интерфейса,
поэтому вы не видите главное окно при выполнении этого вызова
, поскольку поток управления в потоке пользовательского интерфейса заблокирован UDP_listening_PI1 методом.

Вам нужно прослушать UDP-порт в другом фоновом потоке, а затем
перекачать сообщение обратно в основной поток пользовательского интерфейса, если и когда это требуется.

Вероятно, вам нужно что-то вроде приведенного ниже.

     private readonly Dispatcher _uiDispatcher;
    public MainWindow()
    {
        InitializeComponent();
        _uiDispatcher = Dispatcher.CurrentDispatcher;
        var dataContext = new X_Y();
        X_values.DataContext = dataContext;
        Y_values.DataContext = dataContext;
        Task.Factory.StartNew(UDP_listening_PI1);
    }

    public void UDP_listening_PI1()
    {
        UdpClient listener = new UdpClient(48911);
        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, (48911));
        bool done = false;
        try
        {
            while (!done)
            {
                byte[] pdata = listener.Receive(ref groupEP);
                string price = Encoding.ASCII.GetString(pdata);
                int Rawdata1 = int.Parse(price);
                Rawdata_str1 = Rawdata1.ToString();
                UpdateXY(Rawdata_str1);
            }
        }

        finally
        {
            listener.Close();
        }
    }

    private void UpdateXY(string rawData)
    {
        if (!_uiDispatcher.CheckAccess())
        {
            _uiDispatcher.BeginInvoke(DispatcherPriority.Normal, () => { UpdateXY(rawData); });
            return;
        }
        dataContext.X = rawData;
        dataContext.Y = rawData;
        //Need to raise property changed event.
    }
  

Вам также необходимо повысить INotifyPropertyChanged значение, когда вы устанавливаете значения в X amp; Y. Измените параметры X amp; Y и вызовите событие.