Reactive Extension(Rx)GroupByUntil死锁

时间:2014-07-31 17:26:45

标签: c# system.reactive

我试图扼杀来自CarModel的CarUpdatedEventHandler并将它们发送回我的MapListModel。我想出了一些方法来做到这一点,但遗憾的是,由于这个原因,这导致了我的僵局。

此代码的行为是正确的,但导致死锁,所以我的问题是我还能做什么?

var observable = Observable.FromEventPattern<CarUpdatedEventAgrs>(_carModel, "CarUpdatedEventHandler").GroupByUntil(
                key => key.EventArgs.Car, grp => grp.Throttle(TimeSpan.FromMilliseconds(WATCHLIST_THROTTLE_DEPLAY_MS)));

observable.Subscribe(i =>
{
   CarUpdatedEventAgrs e = new CarUpdatedEventAgrs();
   e.Car = i.Key;
   this.RaiseEvent<CarUpdatedEventAgrs>(MapListUpdateEventHandler, e);
});
谢谢你的时间!

此代码也导致死锁:

var observable = Observable.FromEventPattern<CarUpdatedEventAgrs>(_carModel, "CarUpdatedEventHandler").GroupByUntil(
                    key => key.EventArgs.Car, grp => grp.Throttle(TimeSpan.FromMilliseconds(WATCHLIST_THROTTLE_DEPLAY_MS)));

    observable.Subscribe(i =>
    {
       Console.WriteLine("Wait for deadlock");
    });

2 个答案:

答案 0 :(得分:0)

我认为这个问题与Throttle操作符与调度程序使用的主线程不同的线程有关,因此您可能会遇到一些问题,尤其是在尝试以某种方式更新UI时。您应该考虑在订阅之前使用ObserveOn运算符,并且可能在主UI线程上观察。假设您正在开发WPF应用程序,可以这样做:

observable.ObserveOnDispatcher().Subscribe( // rest of the code

为了做到这一点,你需要Rx-WPF包。显然,如果您正在使用Windows窗体,则需要相应的调度程序。

答案 1 :(得分:0)

最后为了能够分组和限制,这是使用Rx的方式:

var throttledEvent = Observable.FromEventPattern<YourEventArgs>(ev => _yourObject.SubscribeEvent += ev, ev => _yourObject.SubscribeEvent -= ev).GroupBy(key => key.EventArgs.YourProperty).Select(o => o.Throttle(TimeSpan.FromMilliseconds(YourThrottleTimeMs))).Merge();

这样就好了!