Как использовать System.Linq.Observable.Throttle()

У меня есть следующий код, который использует класс 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(): но он не был удален.

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


person Phillip Ngan    schedule 18.08.2010    source источник
comment
Этот код выглядит правильным для меня. Что такое x_Grid? DataGridView?   -  person Dan Tao    schedule 18.08.2010
comment
x_Grid - это System.Windows.Controls.Grid, т.е. Серебряный DataGrid. Нет проблем с именем события или типом аргумента события, потому что код отлично выполняется без Throttle().   -  person Phillip Ngan    schedule 18.08.2010
comment
С прошлого года в Rx было внесено много изменений и исправлений. Если возможно, попробуйте это на SL3 с последним выпуском Rx.   -  person Stephen Cleary    schedule 18.08.2010
comment
Я сделал опечатку в своем исходном сообщении. Я использую инструментарий SL3 от ноября 2009 г. Тем не менее, я попробую последнюю каплю.   -  person Phillip Ngan    schedule 18.08.2010


Ответы (1)


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

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

person Ana Betts    schedule 24.08.2010