#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 и вызовите событие.