Quello che voglio fare è assicurarsi che se l'unico riferimento al mio osservatore è l'osservabile, esso viene raccolto e smesso di ricevere messaggi.Creazione di un abbonamento debole a un IObassable
Dire Ho un controllo con una casella di riepilogo su di esso chiamato Messaggi e questo codice dietro:
//Short lived display of messages (only while the user's viewing incoming messages)
public partial class MessageDisplay : UserControl
{
public MessageDisplay()
{
InitializeComponent();
MySource.IncomingMessages.Subscribe(m => Messages.Items.Add(m));
}
}
Che si connette a questa fonte:
//Long lived location for message store
static class MySource
{
public readonly static IObservable<string> IncomingMessages = new ReplaySubject<string>;
}
Quello che non voglio è per mantenere il messaggio visualizzato in memoria molto tempo dopo che non è più visibile. Idealmente mi piacerebbe un po 'di estensione in modo da poter scrivere:
MySource.IncomingMessages.ToWeakObservable().Subscribe(m => Messages.Items.Add(m));
anche io non voglio fare affidamento sul fatto che MessageDisplay è un controllo utente come io poi vogliono andare per una configurazione con MVVM MessageDisplayViewModel che non sarà un controllo dell'utente.
Avete qualche posto nel codice quando si sa che non lo fai vuoi più l'Observable?In tal caso, è possibile prendere il 'IDisposable' restituito dal metodo' Subscribe' per sbarazzarsi di esso quando è necessario. – lbergnehr
@seldon Potrei usarlo per questo specifico esempio, solo ogni volta che la finestra del messaggio è chiusa, ma voglio un approccio molto più generale così posso usare questa funzionalità in modo più ampio e impedire ad altri programmatori che usano le mie librerie di dimenticare qualcosa da qualche parte . Ho visto qualcosa di correlato in MVVMLightToolkit, ma non per IObservable e non capisco davvero come funzioni e queste cose sono notoriamente difficili da ottenere. – ForbesLindesay
Si potrebbe fare riferimento alla classe 'WeakReference', che può essere utilizzata per fare in modo che le istanze vengano raccolte dal garbage collector anche se sono 'referenziate'. Tuttavia, ci sono molti operatori nelle estensioni reattive che si occupano di smaltire l'osservabile a un certo punto. Se hai qualche evento o qualcosa del genere quando sai che hai finito con l'osservabile, forse quelli dovrebbero bastare? – lbergnehr