Как я могу использовать System.Linq.Observable.Throttle () - PullRequest
0 голосов
/ 18 августа 2010

У меня есть следующий код, который использует класс Observable из System.Reactive. Я использую набор инструментов Silverlight 3, выпущенный в ноябре 2009 года.

private IObservable<Event<EventArgs>> _ob;
private IDisposable _proxy;
 ... 

private void Init()
{
  _ob = Observable
           .FromEvent<EventArgs>( x_Grid, "LayoutUpdated" )
           .Throttle( 2000 );  // *** <- The problem
  _proxy = _ob.Subscribe( () => { } );
}

Фрагмент кода приводит к исключению:

System.ObjectDisposedException: Cannot access a disposed object.
   at System.Threading.TimerBase.ChangeTimer(UInt32 dueTime, UInt32 period)
   at System.Threading.Timer.Change(Int32 dueTime, Int32 period)
   at System.Linq.Observable.<>c__DisplayClass175`2.<>c__DisplayClass17a.<Generate>b__173(Object _)
   at System.Threading._TimerCallback.TimerCallback_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading._TimerCallback.PerformTimerCallback(Object state)

Если метод Throttle () отсутствует, код работает нормально. Трассировка стека исключений указывает на доступ к удаленному объекту. Единственный известный мне одноразовый объект - это объект, возвращенный вызовом Subscribe (), но он не был удален.

Может кто-нибудь указать на проблему с этим кодом?

1 Ответ

1 голос
/ 24 августа 2010

Вызывается ли Init () до InitializeComponent (то есть до правильной загрузки Xaml?). В противном случае ваш код выглядит правильно - если это не исправит, я бы сказал, что вам следует обновить систему до SL4 (по крайней мере, попробоватьRx).

Кроме того, более практичное использование Rx в SilverLight происходит через библиотеку ReactiveXaml (полное раскрытие: я автор).

...