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

当我最终订阅时,操作只会发生一次,然后观察者在完成时被处置。

,这是我的问题:有没有办法使该代码连续起作用?每次收到新日志时都会接收"做"操作?

侧边栏:只想想知道可观察到的意思。fromasyncpattern如果我不能再利用它,最好从静态上键入两种开始和结束的方法,而不是在以后需要处置的更多课程的开销。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>

-im也为整个其他不同选项开放,除了使用TPL。

尝试以下:

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

您需要使用.Using管理IDispose资源,并且需要.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,然后将观察者订阅到该缓冲区,以便每次触发它。也就是说,缓冲区需要是呼叫之间的相同实例。

相关内容

  • 没有找到相关文章

最新更新