Correct, Pali. That (blocked finalizer) is in fact exactly what MS Support has diagnosed (and what I'd suspected, based on that same article you linked to and some others).
I received info from their "esacalation team" saying that we should "Please investigate the logic inside SerializableObject.RemoveHandler()". I don't believe we have that code, however, plus obviously the issue could be related to one of our objects that's based on that.
The support person said that this is the call stack from the blocked finalization thread, and it seems to be because some finalizer is allocating something (looks like an array), which is causing a GC, for which the finalizer has to wait:
"The finalizer thread triggered the GC and it is blocked waiting for GC to complete.
…
..
00000000`04e9e850 000007fe`f9584d85 clr!SVR::gc_heap::allocate_large_object+0x65
00000000`04e9e8b0 000007fe`f93e407c clr!AllocateArrayEx+0xa1a
00000000`04e9ea20 000007fe`f725e5df clr!JIT_NewArr1+0x45c
00000000`04e9ebf0 000007fe`f72428ee mscorlib_ni!System.MulticastDelegate.DeleteFromInvocationList(System.Object[], Int32, Int32, Int32)+0x5f
00000000`04e9ec60 000007ff`00c4945b mscorlib_ni!System.MulticastDelegate.RemoveImpl(System.Delegate)+0x10e
00000000`04e9ed00 000007ff`010cc4a6 Gizmox_WebGUI_Common!Gizmox.WebGUI.Forms.SerializableObject.RemoveHandler(Int32, System.Delegate)+0x9b
00000000`04e9ed80 000007fe`f93e9666 Gizmox_WebGUI_Common!Gizmox.WebGUI.Forms.ComponentBase.Finalize()+0x26
Obviously, we should be able to avoid that happening by calling .Dispose() to release resources and suppress finalization -- if we knew what objects this is not being done for. I've added event-hanlder unwiring code and calls to .Dispose throughout our app, but so far have not made the type of event pictured in my previous post go away. On average, they last ~10-15 minutes, but the signature is similar in them all.
-Kelly