[英]Observable.FromAsyncPattern with UDPClient.EndReceive and ref remote endpoint Parameter
[英]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.