代码之家  ›  专栏  ›  技术社区  ›  user584018

这段代码是否适用于使用Rx核心的UdpClient

  •  2
  • user584018  · 技术社区  · 7 年前

    下面的代码是否正确,我正在对其进行一些设置 UdpClient 然后使用 Observable.Using(() ?

    请建议是否有其他方式写它?

    public static IObservable<UdpReceiveResult> UdpStream()
        {
    
            return Observable.Defer(() =>
            {
                UdpClient receiverUDP = new UdpClient();
                receiverUDP.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                receiverUDP.EnableBroadcast = true;
                receiverUDP.Client.ExclusiveAddressUse = false;
                receiverUDP.Client.Bind(new IPEndPoint(IPAddress.Any, 514));
    
    
                return Observable.Using(() => receiverUDP,
                    udpClient => Observable.Defer(() =>
                        udpClient.ReceiveAsync().ToObservable()).Repeat());
            });
    
        }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Enigmativity    7 年前

    根据意见中的要求:

    public static IObservable<UdpReceiveResult> UdpStream()
    {
        return Observable.Defer(() =>
        {
            UdpClient receiverUDP = new UdpClient();
            receiverUDP.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            receiverUDP.EnableBroadcast = true;
            receiverUDP.Client.ExclusiveAddressUse = false;
            receiverUDP.Client.Bind(new IPEndPoint(IPAddress.Any, 514));
    
            return
                Observable
                    .Using(
                        () => receiverUDP,
                        udpClient =>
                            Observable
                                .Defer(() =>
                                    Observable
                                        .FromAsync(() => udpClient.ReceiveAsync()))
                                .Repeat());
        });
    }
    

    就我个人而言,我会这样做:

    public static IObservable<UdpReceiveResult> UdpStream()
    {
        return
            Observable
                .Using(
                    () =>
                    {
                        UdpClient receiverUDP = new UdpClient();
                        receiverUDP.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                        receiverUDP.EnableBroadcast = true;
                        receiverUDP.Client.ExclusiveAddressUse = false;
                        receiverUDP.Client.Bind(new IPEndPoint(IPAddress.Any, 514));
                        return receiverUDP;
                    },
                    udpClient =>
                        Observable
                            .Defer(() =>
                                Observable
                                    .FromAsync(() => udpClient.ReceiveAsync()))
                            .Repeat());
    }