根据意见中的要求:
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());
}