为了账号安全,请及时绑定邮箱和手机立即绑定

Observable.FromAsyncPattern和UdpClient C#

Observable.FromAsyncPattern和UdpClient C#

C#
MM们 2021-04-29 14:14:55
我希望能够使用反应式异步接收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还为其他所有其他选项打开。
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

试试这个:


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());


查看完整回答
反对 回复 2021-05-16
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-05-16
  • 2 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信