Singleton oraz WeakReference

W zdecydowanej większości przypadków jestem przeciwnikiem singleton’a i uważam to za anty-wzorzec. Dużo lepiej użyć IoC i przekazywać wszędzie w konstruktorach tą samą instancję. Istnieją jednak przypadki, w których użycie singleton’a nie jest brzydkie. Ostatnio miałem klasę, która potrzebowała pewnych danych – kolekcję prostych struktur. Każda struktura zawiera string i pole bool. Ze względu, że […]

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 […]

WeakReference – wprowadzenie

Chciałbym poświęcić kilka postów na opisanie WeakReference oraz praktycznych przykładów wykorzystania tej klasy. W dzisiejszym wpisie strona teoretyczna i opis klasy. Referencje w środowisku .NET można podzielić na słabe (weak references) oraz silne\mocne (strong references).  Silne referencje są wszystkim doskonale znane np: var sampleClass = new SampleClass(); Słabą referencje można utworzyć wyłącznie za pomocą klasy […]

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 = […]

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 […]