我希望能够使用被动异步来异步接收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还可以打开其他所有选项。
答案 0 :(得分:1)
试试这个:
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());
答案 1 :(得分:0)
这是因为观察者在给定的集合上工作。从BeginReceive
返回的集合与再次调用它不同。使用您已经显示的代码,我不会感到惊讶它只能运行一次。您需要向BeginReceive
提供一致的缓冲区,然后每次都为该缓冲区订阅一个观察者。也就是说,缓冲区需要在调用之间是相同的实例。