2017-07-12 1 views
1

Ich verwende eine C# -Konsolenanwendung mit .NET 4.5.1. Wenn ich die folgende Funktion ausführe, beendet der Aufruf von udpClient.ReceiveAsync() das Programm ohne Ausnahme still und ohne Ausnahme. Wie debugge ich das?C# erwarten udpClient.ReceiveAsync() schlägt fehl und beendet das Programm

public async void Run() 
    { 
     try 
     { 
      var armIpAddress = IPAddress.Parse("239.1.11.1"); 
      using (var udpClient = new UdpClient()) 
      { 
       udpClient.ExclusiveAddressUse = false; 
       var ipEndPoint = new IPEndPoint(IPAddress.Any, 12020); 
       udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
       udpClient.ExclusiveAddressUse = false; 
       udpClient.Client.Bind(ipEndPoint); 
       udpClient.JoinMulticastGroup(armIpAddress); 

       while (true) 
       { 
        var result = await udpClient.ReceiveAsync(); 
        //... 
       } 
     } 
     catch (Exception x) 
     { 
      Console.WriteLine(x.Message); 
     } 
    } 
+4

Was 'Run' ruft und warum ist das' async void' statt 'async Task'? Das ist die Hauptquelle für Unübertragbarkeit. –

Antwort

5

Der Aufruf von await udpClient.ReceiveAsync() gefangen können nicht das Programm beendet wird, noch ist es still Versagen.

Da dies geschieht, ich nehme an, Sie so etwas wie dieses:

public static void Main(string[] args) 
{ 
    ... 
    Run(); 
} 

In einem async void Verfahren wird die Steuerung an die Eltern zurückgegeben, sobald ein await Anruf erreicht ist, so dass der Fluss von der Programm wäre so etwas wie:

public static void Main(string[] args) 
{ 
    ... 
    var armIpAddress = IPAddress.Parse("239.1.11.1"); 
    using (var udpClient = new UdpClient()) 
    { 
     udpClient.ExclusiveAddressUse = false; 
     ....... 

     while (true) 
     { 
      return; 
     } 
    } 
} 

So endet das Programm, weil kein weiterer Blockiercode.

Damit dies funktioniert, wie man erwarten würde, dies den Code ändern:

public static void Main(string[] args) 
{ 
    ... 
    Run().Wait(); 
} 

public async Task Run() { ... } 
1

über die aufrufende Methode nicht sicher, aber mit den gegebenen Infomationen, würde ich folgende article vorschlagen, die Best Practices rund um async hat erwarten von @Stephen Cleary

Es sagt async void zu vermeiden und ich bin einfügen ein Auszug aus dem Artikel hier zum schnellen Nachschlagen

  1. Async Leere Methoden können verheerenden Schaden anrichten, wenn der Anrufer nicht erwartet sie async zu sein. Wenn der Rückgabetyp Aufgabe ist, weiß der Anrufer, dass es sich um handelt, der eine zukünftige Operation betrifft. Wenn der Rückgabetyp ungültig ist, könnte der Aufrufer davon ausgehen, dass die Methode bis zur Rückgabe abgeschlossen ist. Dieses Problem kann auf viele unerwartete Arten auftreten.

    1. Ausnahmen von einer Async Void-Methode nicht mit Fang
Verwandte Themen