Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Hvordan adskiller det svage begivenhedsmønster sig fra klassiske begivenheder i MVVMCross


Hvordan adskiller det svage begivenhedsmønster sig fra klassiske begivenheder i MVVMCross


Det svage begivenhedsmønster og klassiske begivenheder i MVVMCROSS (eller enhver .NET -ramme) tjener forskellige formål og har forskellige implementeringer, der primært er rettet mod at styre hukommelseslækager og objekt levetid.

Klassiske begivenheder

Klassiske begivenheder i .NET er baseret på stærke referencer. Når et objekt abonnerer på en begivenhed med et andet objekt, oprettes en stærk reference fra begivenhedskilden til abonnenten. Dette betyder, at så længe begivenhedskilden har en henvisning til abonnenten, kan abonnenten ikke indsamles affald, selvom det ikke længere er nødvendigt eller henvises til andetsteds i applikationen. Dette kan føre til hukommelseslækager, hvis abonnenten ikke eksplicit er afmeldt fra begivenheden, når det ikke længere er nødvendigt.

I MVVMCROSS kan klassiske begivenheder bruges til kommunikation mellem ViewModels og Views, men de kræver omhyggelig styring for at undgå hukommelseslækager. For eksempel, hvis en ViewModel udsætter en begivenhed, og en visning abonnerer på den, vil ViewModel have en stærk henvisning til udsigten, hvilket forhindrer, at den bliver indsamlet affald, indtil abonnementet eksplicit fjernes.

svagt begivenhedsmønster

Det svage begivenhedsmønster er designet til at forhindre hukommelseslækager ved at bruge svage referencer i stedet for stærke. Når en abonnent bruger et svagt begivenhedsmønster til at abonnere på en begivenhed, har begivenhedskilden en svag henvisning til abonnenten. Dette gør det muligt at indsamle abonnenten, hvis den ikke længere henvises til andetsteds i applikationen, selvom den ikke eksplicit har afmeldt fra begivenheden.

I MVVMCROSS kan brug af svage begivenheder hjælpe med at opretholde en ren arkitektur ved at sikre, at ViewModels ikke har stærke henvisninger til synspunkter. Dette er især vigtigt i mobile applikationer, hvor hukommelsesstyring er kritisk. MVVMCROSS leverer udvidelser som 'WeakSubscribe' for at lette brugen af ​​svage begivenheder, hvilket giver udviklere mulighed for at abonnere på begivenheder uden at skabe stærke referencer, der kan føre til hukommelseslækager.

Implementering og fordele

Implementering af svage begivenheder involverer typisk oprettelse af en brugerdefineret mekanisme til at styre abonnementer ved hjælp af `svagereference 'objekter. Denne tilgang sikrer, at abonnenter kan indsamles affald, hvis de ikke længere er nødvendige, hvilket reducerer risikoen for hukommelseslækager. Imidlertid introducerer den også yderligere kompleksitet og en lille ydelse over hovedet på grund af behovet for at kontrollere, om abonnenter stadig lever, før de ringer til deres begivenhedshåndterere.

Ulemper og overvejelser

Mens det svage begivenhedsmønster er gavnligt for at forhindre hukommelseslækager, har det nogle ulemper. Det kan være mere kompliceret at implementere end klassiske begivenheder, og der er en risiko for "zombie" -tabonnenters objekter, der ikke længere er i brug, men endnu ikke er blevet affald indsamlet. Hvis en begivenhed er hævet, og en zombie -abonnents handler udføres, kan den føre til uventet opførsel eller fejl.

Sammenfattende adskiller det svage begivenhedsmønster i MVVMCROSS sig fra klassiske begivenheder ved hjælp af svage referencer for at forhindre hukommelseslækager og gøre det muligt for abonnenter at blive indsamlet affald lettere. Selvom det giver betydelige fordele med hensyn til hukommelsesstyring, kræver det omhyggelig implementering og overvejelse af potentielle ulemper.

Citater:
[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capturing-the-onexit-event-in-wpf-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-mattern-is-dangerous/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/navigation/respondering-the-events-from-different-controls-in-the-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-adoid-nasty-memory-leaks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-matterns?view=netdesktop-9.0
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/Questions/13788787/when-to-s-onseweak-events