Reactive拡張機能について学習していて、自分のコードのいくつかを再調整しようとしています。Observable.FromAsyncPattern with UDPClient.EndReceiveとrefリモートエンドポイントパラメータ
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)));
私の加入者は、リモートIPEndPointにアクセスする必要がある場合はどう?私の現在の化身では、私はイベントを使用して、byte[]
とIPEndPoint
をラップするカスタムクラスを返します。私は私の人生のためにはできません、Rxでこれを行う方法を考えてください。行うには少し単純、そしてより多くの近代的な方法があります、他の誰のために
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));
});
}
これを行う最新の方法でこれを正しい答えにしました... – Tim