繁体   English   中英

Observable.FromAsyncPattern和UdpClient C#

[英]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还为其他所有其他选项打开。

尝试这个:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM