Observable.FromAsyncPattern& UdpClient C#

时间:2018-04-25 22:15:47

标签: c# unity3d udpclient unirx

我希望能够使用被动异步来异步接收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个方法,而不是获得需要稍后处理的更多类实例的开销。 / p> 除了使用TPL之外,

-im还可以打开其他所有选项。

2 个答案:

答案 0 :(得分:1)

试试这个:

var query =
    Observable
        .Using(
            () => new UdpClient(new IPEndPoint(IPAddress.Any, 20000)),
            udpServer =>
                Observable
                    .Defer(() =>
                        Observable
                            .FromAsync(() => udpServer.ReceiveAsync()))
                    .Repeat());

您需要使用IDispose来管理.Using资源,并且需要.RepeatFromAsync的调用。

FromAsyncPattern现已过时。

如果您需要使用过时的FromAsyncPattern,请执行以下操作:

var query =
    Observable
        .Using(
            () => new UdpClient(20000),
            udpServer =>
                Observable
                    .Defer(() =>
                        Observable
                            .FromAsyncPattern(udpServer.BeginReceive, t => udpServer.EndReceive(t, ref remoteEP)))
                    .Repeat());

答案 1 :(得分:0)

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