Steven Giesel
31.08.2023, 11:52 Uhr
C#: Speicherlecks vermeiden mit schwachen Events
Events in C# haben einen erheblichen Nachteil, sagt Steven Giesel: Der Publisher hält einen starken Verweis auf den Subscriber und dies kann zu Speicherlecks führen. Giesel zeigt ein Muster für das Implementieren schwacher Ereignisse in C#.
In einem typischen ereignisbasierten System gibt ein Publisher ein Ereignis bekannt, und die Abonnenten registrieren sich, um Benachrichtigungen zu erhalten, wenn das Ereignis ausgelöst wird. Der Herausgeber hält einen Verweis auf den Abonnenten, und wenn das Ereignis ausgelöst wird, ruft der Herausgeber den Ereignishandler des Abonnenten auf.
Ein Problem tritt jedoch auf, wenn ein Abonnent vergisst, die Registrierung für das Ereignis aufzuheben. Wenn der Publisher durch dieses Ereignis einen starken Verweis auf den Abonnenten hält, wird der Abonnent nicht gelöscht, selbst wenn andere Teile der Anwendung ihre Verweise auf den Abonnenten freigegeben haben. Dadurch entsteht ein Speicherleck. Und das gilt auch umgekehrt: Stellen Sie sich einen langlebigen Publisher und einen kurzlebigen Abonnenten vor. Wenn der Abonnent vergisst, sich von dem Ereignis abzumelden, hält der Verleger einen Verweis auf den Abonnenten, und der Abonnent wird nicht gelöscht!
Mit dem "Weak-Event"-Muster in C# versucht Entwickler Steven Giesel dieses Problem zu entschärfen. Die Kernidee seiner Lösung ist die Verwendung einer schwachen Referenz auf den Abonnenten anstelle einer starken Referenz. Ein schwacher Verweis ist ein Verweis, der nicht verhindert, dass das Objekt, auf das er verweist, vom Garbage Collecting erfasst wird.
Wie sich diese Idee umsetzen lässt zeigt Giesel in diesem Blogbeitrag.