我希望能够使用反应式以异步接收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
,然后将观察者订阅到该缓冲区,以便每次触发它。也就是说,缓冲区需要是呼叫之间的相同实例。