C# Observable.FromAsyncPattern与UDPClient.EndReceive和ref remote endpoint参数

C# Observable.FromAsyncPattern与UDPClient.EndReceive和ref remote endpoint参数,c#,asynchronous,system.reactive,C#,Asynchronous,System.reactive,我正在学习反应式扩展,并尝试重新考虑我的一些代码 UDPClient.EndReceive接受一个ref-IPEndPoint参数,因此我目前有以下工作: UdpClient receiverUDP = new UdpClient(); receiverUDP.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); receiverUDP.EnableBroadcast = tr

我正在学习反应式扩展,并尝试重新考虑我的一些代码

UDPClient.EndReceive
接受一个
ref-IPEndPoint
参数,因此我目前有以下工作:

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, 1234));

IPEndPoint ep = null;
var async = Observable.FromAsyncPattern<byte[]>(receiverUDP.BeginReceive, (i) => receiverUDP.EndReceive(i, ref ep));
var subscr = async().Subscribe(x => Console.WriteLine(ASCIIEncoding.ASCII.GetString(x)));
UdpClient receiverUDP=new UdpClient();
receiverUDP.Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
receiverUDP.EnableBroadcast=true;
receiverUDP.Client.ExclusiveReadDressUse=false;
receiverUDP.Client.Bind(新的IPEndPoint(IPAddress.Any,1234));
IPEndPoint ep=null;
var async=Observable.fromsyncPattern(receiverUDP.BeginReceive,(i)=>receiverUDP.EndReceive(i,ref-ep));
var subscr=async().Subscribe(x=>Console.WriteLine(asciencecoding.ASCII.GetString(x));

如果我的订户需要访问远程IPEndPoint怎么办?在我当前的化身中,我使用事件,并传回一个自定义类,该类包装
byte[]
IPEndPoint
。我无法用Rx解决这个问题。

如果您已经为
byte[]
IPEndPoint
创建了一个包装类,为什么不使用
Select
将其作为序列返回:

private IObservable<RemoteData> GetRemoteDataAsync()
{
    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, 1234));

        IPEndPoint ep = null;
        return Observable.FromAsyncPattern<byte[]>(
                   receiverUDP.BeginReceive, 
                   (i) => receiverUDP.EndReceive(i, ref ep)
               )()
               .Select(bytes => new RemoteData(bytes, ep));
    });
}
private IObservable GetRemoteDataAsync()
{
返回可观察的延迟(()=>
{
UdpClient receiverUDP=新的UdpClient();
receiverUDP.Client.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReuseAddress,true);
receiverUDP.EnableBroadcast=true;
receiverUDP.Client.ExclusiveReadDressUse=false;
receiverUDP.Client.Bind(新的IPEndPoint(IPAddress.Any,1234));
IPEndPoint ep=null;
返回可观察的.FromAsyncPattern(
接管人开始接收,
(i) =>receiverUDP.EndReceive(i,ref-ep)
)()
.Select(bytes=>newremotedata(bytes,ep));
});
}

对于其他人来说,有一种更简单、更现代的方法,使用
ReceiveAsync

public static IObservable<UdpReceiveResult> UdpStream(IPEndPoint endpoint)
{
    return Observable.Using(() => new UdpClient(endpoint),
        udpClient => Observable.Defer(() =>
            udpClient.ReceiveAsync().ToObservable()).Repeat());
}

然后使用
Select
将流投影到您想要的任何类型。

“System.Func”不包含“Select”的定义,已更改为:var Func=Observable.FromAsyncPattern(receiverUDP.BeginReceive,(i)=>receiverUDP.EndReceive(i,ref ep) ); return func().Select(bytes=>newudpmessage(bytes,ep));
var stream = UdpStream(new IPEndPoint(IPAddress.Any, 514));