我正在尝试创建一个监听要引发的事件的observable,并允许我等待它被执行。到目前为止我看到的是这样的:
private async Task ConnectStatusMonitor()
{
// show the splash text
SetSplashText("Connecting Server Status Monitor");
var currentStatusChangedObservable = Observable.FromEventPattern(
h => StatusManager.Instance.CurrentStatusChanged += h,
h => StatusManager.Instance.CurrentStatusChanged -= h)
.Take(1);
using (currentStatusChangedObservable.Subscribe(ep => Console.WriteLine("On Next Triggered")))
{
await StatusMonitor.Instance.Start();
// show the splash text
SetSplashText("Waiting For Server Status");
// execution awaits forever
await currentStatusChangedObservable;
}
}
我的StatusManager
在致电CurrentSatusChanged
后不久就提出Start()
。我在输出中看到“On Next Triggered”,但它在最后等待时卡住了。
我认为Take(1)
将允许Observable知道它已经在事件被提升一次时完成,并且一旦观察完成,等待观察者将继续。
答案 0 :(得分:1)
这是一个经典的异步问题,您需要在启动之前监视任何异步活动的完成情况。你可以这样做:
在您第一次等待之前
var statusChanged = currentStatusChangedObservable.ToTask();
然后用
替换第二个awaitawait statusChanged;
在您编写的代码中,最终等待实际上是创建了对事件的第二次订阅,该订阅可能已经被解雇。
答案 1 :(得分:0)
一条线索:如果{等待} CurrentStatusChanged
在您等待它之前发生了什么?