2010-08-18 11 views
0

J'ai le code suivant qui utilise la classe Observable de System.Reactive. J'utilise la boîte à outils Silverlight 3 de novembre 2009.Comment utiliser System.Linq.Observable.Throttle()

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(() => { }); 
} 

Les résultats de fragment de code à l'exception:

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) 

Si la méthode des gaz() n'est pas présent, le code fonctionne très bien. La trace de pile d'exception indique l'accès à un objet éliminé. Le seul objet jetable dont je suis au courant est celui retourné par l'appel Subscribe(): mais cela n'a pas été éliminé.

Quelqu'un peut-il indiquer le problème avec ce code?

+0

Ce code * me semble * juste. Qu'est-ce que 'x_Grid'? Un 'DataGridView'? –

+0

x_Grid est un System.Windows.Controls.Grid, à savoir. un DataGrid Silverlight. Il n'y a pas de problème avec le nom d'événement ou le type d'événement car le code s'exécute correctement sans le Throttle() –

+0

Il y a eu * beaucoup * de changements et de corrections de bugs dans Rx depuis l'année dernière. Si possible, essayez ceci sur SL3 avec la dernière version de Rx. –

Répondre

1

Init() est-il appelé avant InitializeComponent (c'est-à-dire avant que Xaml ne soit chargé correctement?) Votre code semble correct sinon - si cela ne résout pas, je dirais que vous devriez passer à SL4 (au moins sur Rx).

En outre, une utilisation plus pratique de Rx dans SilverLight est via le ReactiveXamllibrary (divulgation complète: je suis l'auteur).