使用Observable等待事件执行

时间:2013-11-20 04:43:19

标签: c# asynchronous system.reactive

我正在尝试创建一个监听要引发的事件的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)将允许Obse​​rvable知道它已经在事件被提升一次时完成,并且一旦观察完成,等待观察者将继续。

2 个答案:

答案 0 :(得分:1)

这是一个经典的异步问题,您需要在启动之前监视任何异步活动的完成情况。你可以这样做:

在您第一次等待之前

var statusChanged = currentStatusChangedObservable.ToTask();

然后用

替换第二个await
await statusChanged;

在您编写的代码中,最终等待实际上是创建了对事件的第二次订阅,该订阅可能已经被解雇。

答案 1 :(得分:0)

一条线索:如果{等待} CurrentStatusChanged在您等待它之前发生了什么?