У меня нет проблем с использованием метода UDPClient
BeginReceive
из консольного приложения.Однако я не могу запустить его из моего приложения WPF.Я очень смущен.Я предполагаю, что это как-то связано с тем, откуда я вызываю этот код.Я новичок в WPF.Есть ли что-то, что я неправильно понимаю в связывании UDPClient
в WPF?
Имеет ли Inheriting from Application что-то, что может помешать UDPClient BeginReceive ()
Теперь этот стек вызовов кода поступает изApp.xaml.cs для ButtonClick()
, который создает экземпляр MachineItem
и вызывает StartMachine
.Никаких странных потоков или чего-то еще (если WPF не делает что-то, о чем я не знаю во время нажатия кнопки).Снова вызывается BeginReceive()
, но если я поставлю точку останова в Receive(IAsyncResult res)
, ничего не произойдет.
public partial class App : Application
{
//... all the normal stuff here
private void Button_Click(object sender, RoutedEventArgs e)
{
MachineItem currentMachine = (MachineItem)(sender as Button).DataContext;
currentMachine.StartMachine();
}
}
Теперь, после нажатия кнопки, это происходит:
public class MachineItem : INotifyPropertyChanged
{
IPEndPoint sendersEndPoint;
UdpClient listener;
public void StartMachine()
{
listener = new UdpClient
{
ExclusiveAddressUse = false
};
listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
IPAddress ip = System.Net.IPAddress.Parse(this.LocalNIC_IPAddress);
int ipInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
IPEndPoint endPoint = new IPEndPoint(ipInt, 60811); //new IPEndPoint(IPAddress.Any, listenPort); this might allow me not to know the IP of this local device!
listener.Client.Bind(endPoint);
listener.BeginReceive(new AsyncCallback(Receive), null);
Thread.Sleep(20000); // this is just for testing purposes
}
private void Receive(IAsyncResult res)
{
byte[] bytes = listener.EndReceive(res, ref sendersEndPoint);
listener.BeginReceive(new AsyncCallback(Receive), null);
Console.WriteLine("Received");
}
}
Обновление: Я попытался поместить этот код UDP туда, где сначала запускается приложение, чтобы еще больше сузить проблему.Я все еще получаю то же самое поведение - клиент может вызывать BeginReceive (), но тогда ничего не происходит, даже когда приходят UDP-пакеты, другими словами, асинхронный метод Receive () никогда не вызывается ...
public partial class WVGUIApp : Application
{
IPEndPoint sendersEndPoint;
UdpClient listener;
void AppStartup(object sender, StartupEventArgs args)
{
LoadMachineData();
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
listener = new UdpClient
{
ExclusiveAddressUse = false
};
listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
IPAddress ip = System.Net.IPAddress.Parse("10.178.100.111");
int ipInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
IPEndPoint endPoint = new IPEndPoint(ipInt, 60811); //new IPEndPoint(IPAddress.Any, listenPort); this might allow me not to know the IP of this local device!
listener.Client.Bind(endPoint);
listener.BeginReceive(new AsyncCallback(Receive), null);
//Thread.Sleep(20000);
}
private void Receive(IAsyncResult res)
{
byte[] bytes = listener.EndReceive(res, ref sendersEndPoint);
listener.BeginReceive(new AsyncCallback(Receive), null);
Console.WriteLine("Received");
}
}