Observable.FromAsyncPattern和UdpClient C#

我希望能够使用反应式异步接收udp软件包。我已经写了这段代码。


udpServer = new UdpClient(20000);

remoteEP = new IPEndPoint(IPAddress.Any, 20000);


var read = Observable.FromAsyncPattern(udpServer.BeginReceive, t => udpServer.EndReceive(t, ref remoteEP));

然后我使用此函数并存储IObservable结果。


reader = read()

       .Do(s =>

       {

           Logs.Add(System.Text.Encoding.UTF8.GetString(s));

       })

       .DoOnError(ex => status = ex.Message; );

当我最终订阅时,该操作仅发生一次,然后观察者将被完全处置。


这是我的问题:有没有办法使此代码连续工作?每次接收到新日志时如何接收“ DO”操作?


侧边栏:只是想知道Observable.FromAsyncPattern有什么用处,如果我不能重用它,那么最好在开始和结束时静态键入2个方法,而不是让更多需要稍后处理的类实例产生开销。


除使用TPL之外,-im还为其他所有其他选项打开。


MM们
浏览 200回答 2
2回答

qq_笑_17

试试这个:var query =    Observable        .Using(            () => new UdpClient(new IPEndPoint(IPAddress.Any, 20000)),            udpServer =>                Observable                    .Defer(() =>                        Observable                            .FromAsync(() => udpServer.ReceiveAsync()))                    .Repeat());您需要使用来管理IDispose资源,.Using并且需要.Repeat致电FromAsync。的FromAsyncPattern是现在已经过时。如果您需要使用过时的方法,FromAsyncPattern请执行以下操作:var query =    Observable        .Using(            () => new UdpClient(20000),            udpServer =>                Observable                    .Defer(() =>                        Observable                            .FromAsyncPattern(udpServer.BeginReceive, t => udpServer.EndReceive(t, ref remoteEP)))                    .Repeat());

慕无忌1623718

这是因为观察者在给定的集合上工作。从返回的集合BeginReceive不同于再次调用它。使用您显示的代码,我并不惊讶它只能运行一次。您需要提供一个一致的缓冲区BeginReceive,然后向该缓冲区预订观察者,因为它每次都会触发。也就是说,缓冲区在两次调用之间必须是相同的实例。
打开App,查看更多内容
随时随地看视频慕课网APP