PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] UDPClient - Eventgesteuert


DraconiX
2011-12-17, 14:45:13
Momentan habe ich das in einer Konsolenanwendung folgendermaßen erledigt:


private static void StartListener()
{
bool done = false;

UdpClient listener = new UdpClient(listenPort);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

try
{
Console.WriteLine("Waiting for broadcast");
while (!done)
{
byte[ ] bytes = listener.Receive(ref groupEP); //<--- hier wird gewartet!

Single testDouble1 = Convert.ToInt32((BitConverter.ToSingle(bytes, 28) * 3.6f));
Single testDouble2 = (BitConverter.ToSingle(bytes, 132));
Single testDouble3 = Convert.ToInt32((BitConverter.ToSingle(bytes, 148) * 10.0f));

Console.WriteLine("{0} - {1} - {2}", (testDouble1 + 0), testDouble2, testDouble3);

}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
listener.Close();
}
}


Nun ist dort das Problem, das an dem Punkt (hier wird gewartet) natürlich die Anwendung gestoppt wird, auf ein Paket gewartet wird, und dann weiter ausgeführt wird. Wenn ich nun aber diese Funktion in eine WindowsForm Anwendung übernehme, dann bleibt dort natürlich die gesamte Abarbeitung der Form stehen.

Gibt es für den UDPClient einen Event welcher nur aufgerufen wird wenn ein Paket eintrifft?! Wenn ja wie gehe ich da vor?! Oder anderer Ansatzpunkt: Kann man dafür einen eigenen Thread erstellen?!

Vielen Dank für eure Hilfe!

Gohan
2011-12-17, 14:57:44
Gibt doch BeginReceive (http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.beginreceive.aspx) als asynchrone Methode.

Trap
2011-12-17, 15:00:29
Wenn du neu damit anfängst guck dir am besten direkt http://msdn.microsoft.com/en-us/vstudio/gg316360 an. Das führt die neuen Keywords async und await extra für sowas ein und ist fester Bestandteil von .NET ab 4.5.

PatkIllA
2011-12-17, 15:07:04
Wenn du neu damit anfängst guck dir am besten direkt http://msdn.microsoft.com/en-us/vstudio/gg316360 an. Das führt die neuen Keywords async und await extra für sowas ein und ist fester Bestandteil von .NET ab 4.5.
Damit blockiert man aber dauerhaft einen Thread des ThreadPools

Monger
2011-12-17, 15:30:09
Wenn du neu damit anfängst guck dir am besten direkt http://msdn.microsoft.com/en-us/vstudio/gg316360 an. Das führt die neuen Keywords async und await extra für sowas ein und ist fester Bestandteil von .NET ab 4.5.
Sind Async und Await nicht exklusiv für Metro?

PatkIllA
2011-12-17, 15:32:52
Sind Async und Await nicht exklusiv für Metro?

wie kommst du darauf?
Außerdem sind die ja im wesentlich syntatic Sugar für vorhandene Funktionen.

Trap
2011-12-17, 15:34:48
Damit blockiert man aber dauerhaft einen Thread des ThreadPools
Auch wenn man die entsprechende Async-Methode (http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.receiveasync%28v=VS.110%29.aspx) aufruft und schon im UI-Thread ist?

PatkIllA
2011-12-17, 15:37:26
Auch wenn man die entsprechende Async-Methode aufruft und schon im UI-Thread ist?
Der Trick ist doch, dass die eigentliche Methode dann asynchron in einem Thread (eben aus dem Threadpool) läuft. Zumindest wenn der Scheduler das für sinnvoll hält, was bei einer langanhaltenden IO Methode wohl der Fall sein wird.
So hab ich das zumindest verstanden.

Trap
2011-12-17, 15:43:38
Der Trick ist doch, dass die eigentliche Methode dann asynchron in einem Thread (eben aus dem Threadpool) läuft.
Bei IO nicht zwangsläufig, da hat das Betriebssystem ja auch eine asynchrone Schnittstelle. Und das OS benutzt intern keine Threads um zu warten ;)

Monger
2011-12-17, 22:22:26

wie kommst du darauf?
Außerdem sind die ja im wesentlich syntatic Sugar für vorhandene Funktionen.
Wenn ich das richtig verstanden habe, wird zumindest das Framework nur für Metro Applikationen die neue Windows API bereitstellen - wo dann eben zeitkritische Operationen wie I/O Zugriffe etc. alle asynchron sind.

Aber klar: das hält dich nicht davon ab, dir selber async Methoden zu schreiben.

Trap
2011-12-18, 00:11:29
Für WinSock oder Dateizugriffe gibt es seit XP/2k asynchrone Funktionen in der Windows API.

Die Metro API unterscheidet sich nur in dem Sinn, dass die synchronen IO-Funktionen der Windows API verboten wurden und die asynchronen Funktionen ein neueres hübscheres Interface haben.

AwesomeSauce
2011-12-18, 01:01:33
http://msdn.microsoft.com/en-us/library/fx6588te.aspx

Könnte was für dich sein. Auf Basis dieses Beispiels habe ich auch schon eine kleine Serverapplikation gebastelt.

DraconiX
2011-12-18, 12:46:45
Ich habe es jetzt einem eigenen Thread vermacht... Ging schön schnell, ist nicht die feine englische Art und meine Variablen muß ich nun leider alle atomar gegen den threadübergriff absichern: Aber es läuft tadellos!