[{"data":1,"prerenderedAt":763},["ShallowReactive",2],{"blog:2005:lapsedlistenersmemoryleaksinsubscriberpublisherscenarios":3,"blogMore-Development":727,"comments-lapsedlistenersmemoryleaksinsubscriberpublisherscenarios":740},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"category":11,"tags":12,"excerpt":16,"body":31,"_type":718,"_id":719,"_source":720,"_file":721,"_stem":722,"_extension":723,"url":724,"wordCount":725,"minutes":726,"commentCount":330},"/blog/2005/lapsedlistenersmemoryleaksinsubscriberpublisherscenarios","2005",false,"en","Lapsed-listeners: Memory leaks in subscriber-publisher scenarios","I’ve been promising something .NET related for a while… here’s something!","2005-01-19T11:32:00+00:00","Development",[13,14,15],".NET","C#","VB.NET",{"type":17,"children":18},"root",[19,26],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":20,"tag":21,"props":27,"children":28},{},[29],{"type":25,"value":30},"There exists a ‘gotcha’ in .NET (and other programming environment) whereby an object has subscribed to another objects published event will not be garbage collected when you expect because the environment itself holds a reference to the subscriber inside the event notification system.",{"type":17,"children":32,"toc":706},[33,37,44,48,53,60,65,71,87,101,115,121,138,144,184,189,195,225,230,251,520,526,555,560,583,588,600,606,620,654,675,691,700],{"type":20,"tag":21,"props":34,"children":35},{},[36],{"type":25,"value":9},{"type":20,"tag":38,"props":39,"children":41},"h2",{"id":40},"the-lapsed-listener-scenario",[42],{"type":25,"value":43},"The lapsed-listener scenario",{"type":20,"tag":21,"props":45,"children":46},{},[47],{"type":25,"value":30},{"type":20,"tag":21,"props":49,"children":50},{},[51],{"type":25,"value":52},"Let’s illustrate with an example:",{"type":20,"tag":54,"props":55,"children":57},"h3",{"id":56},"mybusiness-class",[58],{"type":25,"value":59},"MyBusiness Class",{"type":20,"tag":21,"props":61,"children":62},{},[63],{"type":25,"value":64},"Encapsulates some aspect of business functionality and publishes a Changed event.",{"type":20,"tag":54,"props":66,"children":68},{"id":67},"mytreenode-business-adapter-class",[69],{"type":25,"value":70},"MyTreeNode Business Adapter Class",{"type":20,"tag":21,"props":72,"children":73},{},[74,76,85],{"type":25,"value":75},"Inherits from ",{"type":20,"tag":77,"props":78,"children":82},"a",{"href":79,"rel":80},"https://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsTreeNodeClassTopic.asp",[81],"nofollow",[83],{"type":25,"value":84},"TreeNode",{"type":25,"value":86}," and takes an instance of MyBusiness in the constructor. The object signs up to the Changed event of the MyBusiness object so that it can always accurately show the correct Icon (via ImageIndex), Text and update any associated child nodes etc.",{"type":20,"tag":21,"props":88,"children":89},{},[90,92,99],{"type":25,"value":91},"Now you happily add instances of MyTreeNodeBusinessAdapter class to your ",{"type":20,"tag":77,"props":93,"children":96},{"href":94,"rel":95},"https://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformstreeviewclasstopic.asp",[81],[97],{"type":25,"value":98},"TreeView",{"type":25,"value":100},", each with the associated MyBusiness instance it should be reflecting.",{"type":20,"tag":21,"props":102,"children":103},{},[104,106,113],{"type":25,"value":105},"The problem now arises in that if the TreeNode is removed from the TreeView with either Nodes.Remove or Nodes.Clear then the ",{"type":20,"tag":77,"props":107,"children":110},{"href":108,"rel":109},"https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/dotnetGCbasics.asp",[81],[111],{"type":25,"value":112},"garbage collector",{"type":25,"value":114}," will not be able dispose of the MyTreeNodeBusinessAdapter objects because the MyBusiness objects hold a reference to them in their event notification queues. Even worse, an inactive TreeView hangs around because the not-yet-disposed TreeNode’s are still pointing to it.",{"type":20,"tag":38,"props":116,"children":118},{"id":117},"possible-solutions",[119],{"type":25,"value":120},"Possible solutions…",{"type":20,"tag":122,"props":123,"children":124},"blockquote",{},[125],{"type":20,"tag":21,"props":126,"children":127},{},[128,130,136],{"type":25,"value":129},".NET Framework 3.0 has a ",{"type":20,"tag":77,"props":131,"children":133},{"href":132},"https://msdn2.microsoft.com/en-us/library/aa970850.aspx",[134],{"type":25,"value":135},"WeakEvent pattern",{"type":25,"value":137}," to make things simple!",{"type":20,"tag":54,"props":139,"children":141},{"id":140},"_1-mytreenodebusinessadapter-listens-in-to-treeview-events-and-un-subscribes-when-it-is-removed-rejected",[142],{"type":25,"value":143},"1. MyTreeNodeBusinessAdapter listens in to TreeView events and un-subscribes when it is removed (Rejected)",{"type":20,"tag":21,"props":145,"children":146},{},[147,149,156,158,164,166,173,175,182],{"type":25,"value":148},"TreeNode’s maintain their own internal array of child nodes which they publish under the “Nodes” property which uses the ",{"type":20,"tag":77,"props":150,"children":153},{"href":151,"rel":152},"https://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformstreenodecollectionclasstopic.asp",[81],[154],{"type":25,"value":155},"TreeNodeCollection",{"type":25,"value":157}," class to just point straight back at itself calling internal methods. None are over-ridable and while they ",{"type":20,"tag":159,"props":160,"children":161},"strong",{},[162],{"type":25,"value":163},"do",{"type":25,"value":165}," send the message ",{"type":20,"tag":167,"props":168,"children":170},"code",{"className":169},[],[171],{"type":25,"value":172},"TVM_DELETEITEM",{"type":25,"value":174}," to their own TreeView control it does nothing with them nor does it have methods you could implement in a subclass. (",{"type":20,"tag":77,"props":176,"children":179},{"href":177,"rel":178},"https://www.aisto.com/roeder/dotnet/",[81],[180],{"type":25,"value":181},".NET Reflector",{"type":25,"value":183}," is great for finding out what’s going on inside the WinForms assembly)",{"type":20,"tag":21,"props":185,"children":186},{},[187],{"type":25,"value":188},"This would also mean every UI control you adapt would need sub-classing to override even if you could hook into the remove events.",{"type":20,"tag":54,"props":190,"children":192},{"id":191},"_2-weak-events",[193],{"type":25,"value":194},"2. Weak Events",{"type":20,"tag":21,"props":196,"children":197},{},[198,205,207,214,216,223],{"type":20,"tag":77,"props":199,"children":202},{"href":200,"rel":201},"https://wwww.seedindustries.com/blog/x/",[81],[203],{"type":25,"value":204},"Xavier Musy’s web log",{"type":25,"value":206}," has an interesting C# class called ",{"type":20,"tag":77,"props":208,"children":211},{"href":209,"rel":210},"https://www.seedindustries.com/blog/x/2004_06_01_archive.html",[81],[212],{"type":25,"value":213},"WeakMulticastDelegate",{"type":25,"value":215}," that works in a similar way to normal delegates but uses the ",{"type":20,"tag":77,"props":217,"children":220},{"href":218,"rel":219},"https://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemweakreferenceclasstopic.asp",[81],[221],{"type":25,"value":222},"WeakReference",{"type":25,"value":224}," class in .NET to allow referencing an object that can be garbage collected.",{"type":20,"tag":21,"props":226,"children":227},{},[228],{"type":25,"value":229},"This solution also prevents subscribers from subscribing more than once and also from subscribers throwing an exception that stops other subscribers receiving this event (in .NET an exception will break the chain).",{"type":20,"tag":21,"props":231,"children":232},{},[233,235,241,243,249],{"type":25,"value":234},"Unfortunately it requires that you publish an event by writing ",{"type":20,"tag":167,"props":236,"children":238},{"className":237},[],[239],{"type":25,"value":240},"Add",{"type":25,"value":242}," and ",{"type":20,"tag":167,"props":244,"children":246},{"className":245},[],[247],{"type":25,"value":248},"Remove",{"type":25,"value":250}," methods for your event, not possible directly under VB.NET but possible with the following workaround:",{"type":20,"tag":252,"props":253,"children":254},"ol",{},[255,290,310,468,473,493],{"type":20,"tag":256,"props":257,"children":258},"li",{},[259,261,266,268,273,275,281,282,288],{"type":25,"value":260},"Create a ",{"type":20,"tag":159,"props":262,"children":263},{},[264],{"type":25,"value":265},"C# Class Library",{"type":25,"value":267}," project inside your solution and add the ",{"type":20,"tag":167,"props":269,"children":271},{"className":270},[],[272],{"type":25,"value":213},{"type":25,"value":274}," code to it (remember to put ",{"type":20,"tag":167,"props":276,"children":278},{"className":277},[],[279],{"type":25,"value":280},"using System;",{"type":25,"value":242},{"type":20,"tag":167,"props":283,"children":285},{"className":284},[],[286],{"type":25,"value":287},"using System.Reflection;",{"type":25,"value":289}," at the top of the file)",{"type":20,"tag":256,"props":291,"children":292},{},[293,295,301,302,308],{"type":25,"value":294},"Create a new MyPublisherWorkaround class in the C# project with the ",{"type":20,"tag":167,"props":296,"children":298},{"className":297},[],[299],{"type":25,"value":300},"private WeakMulticastDelegate",{"type":25,"value":242},{"type":20,"tag":167,"props":303,"children":305},{"className":304},[],[306],{"type":25,"value":307},"public event EventHandler",{"type":25,"value":309}," code blocks described in Xavier’s article.",{"type":20,"tag":256,"props":311,"children":312},{},[313,315],{"type":25,"value":314},"In MyPublisherWorkaround create a method to fire your event (because .NET does not let you raise events defined in a parent class) e.g:\n",{"type":20,"tag":316,"props":317,"children":322},"pre",{"className":318,"code":319,"language":320,"meta":321,"style":321},"language-csharp shiki shiki-themes everforest-light dracula","protected internal void Changed(EventArgs e) {\n if (this.weakEventHandler != null) weakEventHandler.Invoke(new object[] { this, e } );\n}```\n","csharp","",[323],{"type":20,"tag":167,"props":324,"children":325},{"__ignoreMap":321},[326,378,459],{"type":20,"tag":327,"props":328,"children":331},"span",{"class":329,"line":330},"line",1,[332,338,343,349,355,361,367,373],{"type":20,"tag":327,"props":333,"children":335},{"style":334},"--shiki-default:#F57D26;--shiki-dark:#FF79C6",[336],{"type":25,"value":337},"protected",{"type":20,"tag":327,"props":339,"children":340},{"style":334},[341],{"type":25,"value":342}," internal",{"type":20,"tag":327,"props":344,"children":346},{"style":345},"--shiki-default:#3A94C5;--shiki-dark:#FF79C6",[347],{"type":25,"value":348}," void",{"type":20,"tag":327,"props":350,"children":352},{"style":351},"--shiki-default:#8DA101;--shiki-dark:#50FA7B",[353],{"type":25,"value":354}," Changed",{"type":20,"tag":327,"props":356,"children":358},{"style":357},"--shiki-default:#5C6A72;--shiki-dark:#F8F8F2",[359],{"type":25,"value":360},"(",{"type":20,"tag":327,"props":362,"children":364},{"style":363},"--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic",[365],{"type":25,"value":366},"EventArgs",{"type":20,"tag":327,"props":368,"children":370},{"style":369},"--shiki-default:#5C6A72;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic",[371],{"type":25,"value":372}," e",{"type":20,"tag":327,"props":374,"children":375},{"style":357},[376],{"type":25,"value":377},") {\n",{"type":20,"tag":327,"props":379,"children":381},{"class":329,"line":380},2,[382,388,393,399,404,410,415,421,426,431,435,440,445,450,454],{"type":20,"tag":327,"props":383,"children":385},{"style":384},"--shiki-default:#F85552;--shiki-dark:#FF79C6",[386],{"type":25,"value":387}," if",{"type":20,"tag":327,"props":389,"children":390},{"style":357},[391],{"type":25,"value":392}," (",{"type":20,"tag":327,"props":394,"children":396},{"style":395},"--shiki-default:#DF69BA;--shiki-default-font-style:inherit;--shiki-dark:#BD93F9;--shiki-dark-font-style:italic",[397],{"type":25,"value":398},"this",{"type":20,"tag":327,"props":400,"children":401},{"style":357},[402],{"type":25,"value":403},".",{"type":20,"tag":327,"props":405,"children":407},{"style":406},"--shiki-default:#35A77C;--shiki-dark:#F8F8F2",[408],{"type":25,"value":409},"weakEventHandler",{"type":20,"tag":327,"props":411,"children":412},{"style":334},[413],{"type":25,"value":414}," !=",{"type":20,"tag":327,"props":416,"children":418},{"style":417},"--shiki-default:#DF69BA;--shiki-dark:#BD93F9",[419],{"type":25,"value":420}," null",{"type":20,"tag":327,"props":422,"children":423},{"style":357},[424],{"type":25,"value":425},") weakEventHandler.",{"type":20,"tag":327,"props":427,"children":428},{"style":351},[429],{"type":25,"value":430},"Invoke",{"type":20,"tag":327,"props":432,"children":433},{"style":357},[434],{"type":25,"value":360},{"type":20,"tag":327,"props":436,"children":437},{"style":384},[438],{"type":25,"value":439},"new",{"type":20,"tag":327,"props":441,"children":442},{"style":345},[443],{"type":25,"value":444}," object",{"type":20,"tag":327,"props":446,"children":447},{"style":357},[448],{"type":25,"value":449},"[] { ",{"type":20,"tag":327,"props":451,"children":452},{"style":395},[453],{"type":25,"value":398},{"type":20,"tag":327,"props":455,"children":456},{"style":357},[457],{"type":25,"value":458},", e } );\n",{"type":20,"tag":327,"props":460,"children":462},{"class":329,"line":461},3,[463],{"type":20,"tag":327,"props":464,"children":465},{"style":357},[466],{"type":25,"value":467},"}```\n",{"type":20,"tag":256,"props":469,"children":470},{},[471],{"type":25,"value":472},"Add the new C# project to your VB.NET project reference and appropriate Imports line at the top of your VB.NET project (obviously).",{"type":20,"tag":256,"props":474,"children":475},{},[476,478,484,486,492],{"type":25,"value":477},"Change your ",{"type":20,"tag":167,"props":479,"children":481},{"className":480},[],[482],{"type":25,"value":483},"MyPublisher",{"type":25,"value":485}," class to inherit from ",{"type":20,"tag":167,"props":487,"children":489},{"className":488},[],[490],{"type":25,"value":491},"MyPublisherWorkaround",{"type":25,"value":403},{"type":20,"tag":256,"props":494,"children":495},{},[496,497,502,504,510,512,518],{"type":25,"value":477},{"type":20,"tag":167,"props":498,"children":500},{"className":499},[],[501],{"type":25,"value":483},{"type":25,"value":503}," class to call the ",{"type":20,"tag":167,"props":505,"children":507},{"className":506},[],[508],{"type":25,"value":509},"Changed",{"type":25,"value":511}," method (or whatever you named it) instead of executing ",{"type":20,"tag":167,"props":513,"children":515},{"className":514},[],[516],{"type":25,"value":517},"RaiseEvent",{"type":25,"value":519}," directly (because of aforementioned restrictions in the .NET framework).",{"type":20,"tag":54,"props":521,"children":523},{"id":522},"_3-weak-delegates",[524],{"type":25,"value":525},"3. Weak Delegates",{"type":20,"tag":21,"props":527,"children":528},{},[529,536,538,545,547,554],{"type":20,"tag":77,"props":530,"children":533},{"href":531,"rel":532},"https://weblogs.asp.net/greg_schechter/",[81],[534],{"type":25,"value":535},"Greg Schechter",{"type":25,"value":537}," on the Microsoft ",{"type":20,"tag":77,"props":539,"children":542},{"href":540,"rel":541},"https://msdn.microsoft.com/Longhorn/understanding/pillars/avalon/default.aspx",[81],[543],{"type":25,"value":544},"Avalon",{"type":25,"value":546}," team has written an article about this very problem and his solution of ",{"type":20,"tag":77,"props":548,"children":551},{"href":549,"rel":550},"https://weblogs.asp.net/greg_schechter/archive/2004/05/27/143605.aspx",[81],[552],{"type":25,"value":553},"Weak Delegates",{"type":25,"value":403},{"type":20,"tag":21,"props":556,"children":557},{},[558],{"type":25,"value":559},"Our scenario would become:",{"type":20,"tag":252,"props":561,"children":562},{},[563,568,573,578],{"type":20,"tag":256,"props":564,"children":565},{},[566],{"type":25,"value":567},"MyPublisher instance receives request to add instance of MySubscriber to event.",{"type":20,"tag":256,"props":569,"children":570},{},[571],{"type":25,"value":572},"MyPublisher creates new instance of own internal class derived from WeakReference.",{"type":20,"tag":256,"props":574,"children":575},{},[576],{"type":25,"value":577},"This WeakReference instance actually contains the reference to the target object.",{"type":20,"tag":256,"props":579,"children":580},{},[581],{"type":25,"value":582},"The WeakReference instance’s event handler (with the same signature) is added to the event listener.",{"type":20,"tag":21,"props":584,"children":585},{},[586],{"type":25,"value":587},"While this works in VB.NET it has a problem in that the class derived from WeakReference requires all subscribers to either be the same class, derived from a common parent or support a specific interface that defines this event handler.",{"type":20,"tag":21,"props":589,"children":590},{},[591,593,598],{"type":25,"value":592},"This defeats much of the point of delegates although it ",{"type":20,"tag":159,"props":594,"children":595},{},[596],{"type":25,"value":597},"might",{"type":25,"value":599}," be possible to rework his code so that WeakReference stores a weak reference to the given event handler and not the object implementing it.",{"type":20,"tag":38,"props":601,"children":603},{"id":602},"stepping-back",[604],{"type":25,"value":605},"Stepping back",{"type":20,"tag":21,"props":607,"children":608},{},[609,611,618],{"type":25,"value":610},"WinForms is focused around the Win32 API itself and not what modern applications require from a UI when developing along ",{"type":20,"tag":77,"props":612,"children":615},{"href":613,"rel":614},"https://c2.com/cgi/wiki?ModelViewController",[81],[616],{"type":25,"value":617},"Model-View-Controller",{"type":25,"value":619}," patterns.",{"type":20,"tag":21,"props":621,"children":622},{},[623,625,631,632,638,640,645,646,652],{"type":25,"value":624},"Compound controls such as TreeView and ListView should deal with interfaces such as ",{"type":20,"tag":167,"props":626,"children":628},{"className":627},[],[629],{"type":25,"value":630},"ITreeNode",{"type":25,"value":242},{"type":20,"tag":167,"props":633,"children":635},{"className":634},[],[636],{"type":25,"value":637},"IListViewItem",{"type":25,"value":639}," and then provide a concrete implementation for backwards compatibility/general use (",{"type":20,"tag":167,"props":641,"children":643},{"className":642},[],[644],{"type":25,"value":84},{"type":25,"value":242},{"type":20,"tag":167,"props":647,"children":649},{"className":648},[],[650],{"type":25,"value":651},"ListViewItem",{"type":25,"value":653},").",{"type":20,"tag":21,"props":655,"children":656},{},[657,659,664,666,673],{"type":25,"value":658},"This would solve ",{"type":20,"tag":159,"props":660,"children":661},{},[662],{"type":25,"value":663},"some",{"type":25,"value":665}," issues. Check out Skybound’s ",{"type":20,"tag":77,"props":667,"children":670},{"href":668,"rel":669},"https://www.skybound.ca/developer/visualstyles/default.aspx",[81],[671],{"type":25,"value":672},"VisualStyles",{"type":25,"value":674}," for a free and easy to use fix for the poor theme support.",{"type":20,"tag":122,"props":676,"children":677},{},[678],{"type":20,"tag":21,"props":679,"children":680},{},[681,683,689],{"type":25,"value":682},"Check out the ",{"type":20,"tag":77,"props":684,"children":686},{"href":685},"https://msdn2.microsoft.com/en-us/library/system.windows.weakeventmanager.aspx",[687],{"type":25,"value":688},"WeakEventManager in .NET 3.5",{"type":25,"value":690}," for an event mechanism that is immune to this problem.",{"type":20,"tag":21,"props":692,"children":693},{},[694],{"type":20,"tag":695,"props":696,"children":697},"em",{},[698],{"type":25,"value":699},"[)amien",{"type":20,"tag":701,"props":702,"children":703},"style",{},[704],{"type":25,"value":705},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":321,"searchDepth":380,"depth":380,"links":707},[708,712,717],{"id":40,"depth":380,"text":43,"children":709},[710,711],{"id":56,"depth":461,"text":59},{"id":67,"depth":461,"text":70},{"id":117,"depth":380,"text":120,"children":713},[714,715,716],{"id":140,"depth":461,"text":143},{"id":191,"depth":461,"text":194},{"id":522,"depth":461,"text":525},{"id":602,"depth":380,"text":605},"markdown","content:blog:2005:lapsedlistenersmemoryleaksinsubscriberpublisherscenarios.md","content","blog/2005/lapsedlistenersmemoryleaksinsubscriberpublisherscenarios.md","blog/2005/lapsedlistenersmemoryleaksinsubscriberpublisherscenarios","md","/blog/2005/lapsedlistenersmemoryleaksinsubscriberpublisherscenarios/",881,4,[728,732,736],{"title":729,"date":730,"url":731},"HTML5 Video Cheatsheet: Optimizing videos for the web","2025-12-05T00:00:00Z","/blog/2025/html5-video-cheatsheet/",{"title":733,"date":734,"url":735},"Transactions in the MongoDB EF Core Provider","2025-10-25","/blog/2025/mongodb-explicit-transactions/",{"title":737,"date":738,"url":739},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","/blog/2025/mongodb-queryable-encryption/",[741],{"_path":742,"_dir":743,"_draft":6,"_partial":6,"_locale":7,"title":744,"description":745,"id":746,"name":747,"email":748,"avatar":749,"url":750,"date":751,"body":752,"_type":718,"_id":760,"_source":720,"_file":761,"_stem":762,"_extension":723},"/comments/lapsedlistenersmemoryleaksinsubscriberpublisherscenarios/4898","lapsedlistenersmemoryleaksinsubscriberpublisherscenarios","4898","Very nice article.... Good job",4898,"Marlon Grech","marlongrech@gmail.com","https://www.gravatar.com/avatar/4231953dc5a7ec7d7b5acb2444eeeeab?r=pg&d=retro","https://marlongrech.wordpress.com","2007-11-01T07:55:43",{"type":17,"children":753,"toc":758},[754],{"type":20,"tag":21,"props":755,"children":756},{},[757],{"type":25,"value":745},{"title":321,"searchDepth":380,"depth":380,"links":759},[],"content:comments:lapsedlistenersmemoryleaksinsubscriberpublisherscenarios:4898.md","comments/lapsedlistenersmemoryleaksinsubscriberpublisherscenarios/4898.md","comments/lapsedlistenersmemoryleaksinsubscriberpublisherscenarios/4898",1779264598662]