Weak event patterns, część II

W poprzednim poście podałem prostą implementację zdarzeń opartych na słabych referencjach. Zachęcam najpierw do przeczytania poprzedniego wpisu bo bez niego będzie ciężko zrozumieć dzisiejszy post. Dziś implementacja zaproponowana na blogu Paul Stovell’a: public sealed class WeakEventHandler<TEventArgs> where TEventArgs : EventArgs { private readonly WeakReference _targetWeakReference; private readonly MethodInfo _handlerMethodInfo; public WeakEventHandler(EventHandler<TEventArgs> strongEventHandler) { _handlerMethodInfo = […]

WeakReference – weak event pattern

Dziś jak obiecałem, praktyczny przykład wykorzystania WeakReference ( o którym mowa była kilka postów wcześniej). Zdarzenia są częstym powodem memory leak.  Na przykład: public class ReportViewModel { public void Init(EmployeesViewModel employeesVm) { employeesVm.PropertyChanged+=EmployeesPropertyChanged; } private void EmployeesPropertyChanged(object sender,EventArgs e) { // logika } } Załóżmy, że nie mamy więcej referencji do ReportViewModel. Mimo to, powyższy […]

WeakEventManager w WPF 4.5

W ostatnich postach pisałem o słabych referencjach oraz podałem przykładowe implementacje obsługi zdarzeń. Niestety mimo generycznego rozwiązania, jednej wady nie udało się usunąć a mianowicie tzw. sacrifice object. Przed rozpoczęciem czytania tego wpisu zachęcam  najpierw do zapoznania się z poprzednimi. WeakEventManager to klasa WPF. Jak wspomniałem, często nie wiemy kiedy listener jest usuwany z pamięci […]

Reactive Extensions: Zdarzenia w RX

Opisywałem już mechanizm konwersji zdarzeń .NET do IObservable. W RX istnieje dodatkowo nowy mechanizm, mający na celu zastąpić standardowe zdarzenia  .NET – przynajmniej w części przypadków. Zastanówmy się, co jest złego tak naprawdę w obsłudze zdarzeń w .NET? 1. Dość często programiści zapominają usunąć zdarzenie co może skutkować memory leak. Czasami jest ciężko zdefiniować moment, […]

Reactive Extensions: Konwersja zdarzeń .NET do RX

Po przeczytaniu poprzednich wpisów, zasada działania i zastosowanie RX powinny być już jasne. Jeśli tak nie jest, koniecznie zachęcam do przeczytania tamtych postów. Jak wspomniałem, RX to ujednolicony model, umożliwiający korzystanie z kolekcji typu “push-based” w jednakowy sposób. Dzisiaj pokażę jak sprawa wygląda dla zdarzeń czyli jak skonwertować EventHandler do IObervable. Oczywiście kluczem do rozwiązania […]

Code review: DispatcherTimer

Dziś miało być o praktycznym przykładzie wykorzystania WeakReference ale stwierdziłem, że najpierw powrócimy znów na chwilę do WPF.  Co myślicie o takiej prostej klasie: class TimePresenterViewModel:BaseViewModel { private readonly DispatcherTimer _timer; const int RefreshTime=6*1000; public TimePresenterViewModel() { _timer=new DispatcherTimer(); _timer.Interval = TimeSpan.FromMilliseconds(RefreshTime); _timer.Tick += TimerTick; _timer.Start(); } void TimerTick(object sender, EventArgs e) { // jakas […]