Re: Finalize never firing
Finalize is called by the system when it finalises the object, which occurs when the GC reclaims the memory it occupies. Garbage collection happens automatically when the system wants to do it. There are some rare occasions where you need to force it by calling GC.Collect but the vast majority of apps should just let the system handle it.
What you do need to do is make sure that you call Dispose on all objects that support when you are done with them, and also make sure you remove references to any objects you no longer need. Note that the Finalize method calls the Dispose method, so this ensures that all disposable objects are disposed at some point, but leaving it up to the system to dispose objects is poor practice. As for removing references, this will often happen automatically as local variables lose scope, but it can also mean clearing collections or setting fields to Nothing.