(.net) CriticalFinalizerObject - What does it really do?
Asked Answered
U

4

7

My understanding about this class is that you should use it when you want to be sure that the Finalizer (destructor) of the class is called, but from a couple of tests I did, it doesn't seem to be true. If it does not make sure that the dispose method is called, is there any other way of doing it? For example, if I want to make sure that some code is run to end my object, even if I close my program via Task Manager or something?

Understand answered 21/7, 2009 at 3:6 Comment(2)
If some code could be run to end your object, then the Task Manager might be unable to close your program. This is why the Task manager 'End Process' stops your process without its cooperation by taking all execution away from it, so preventing the running of any code, cleanup or otherwise.Virelay
I would only note that the question should be edited, or that it has identified a problem in the OPs understanding of disposal vs. finalization, as the Finalize() method and Dispose() method (and paradigms) are completely different.Attorneyatlaw
S
9

Chris Brumme has explained this topic in a way I'm not sure could ever be topped. :)

Sazerac answered 21/7, 2009 at 3:12 Comment(6)
Hmm, so seems CriticalFinalizerObject is not what I was looking at. Is there any way I can be certain that my Finalize method will be called, even if there's a ctrl+alt+del?Understand
If you are looking for reliable operations even if the OS crashes (power outage?), then you should look into transactional processing.Sazerac
I don't need that much, I only need to be able to run some code when the application is closed or ctrl+alt+del'ed.Understand
"End Process" ends the process. Whatever you wanted to run, it's too late.Sazerac
is this still true for .net 4.0 ?Teacup
Could someone edit the question to either update the link or post the full linked topic, please (I was not able to find the topic, so I can not update it myself)? Otherwise the answer is of no use.Burkes
C
4

from a couple of tests I did, it doesn't seem to be true.

Finalizers in .Net are non-deterministic. That means there's no guarantee exactly when the finalizer will be called. Just because an object went out of scope or even was disposed, doesn't mean the finalizer will be called right away. The garbage collector will get around to it at some unknown time in the future.

Coursing answered 21/7, 2009 at 3:12 Comment(4)
Well, like 20min passed and it still didn't execute the code :PUnderstand
The garbage collector doesn't care how much time has passed. If no allocations are made, it won't run. So the important question is what your code did during those 20 minutes -- or whether the finalizer ran when you exited the application.Plasmosome
I opened the application, ctrl+alt+del'ed it.Understand
Actually, I simply closed it(now that I think of it), clicked in the X on a console application.Understand
C
3

If you really need code to run when when your program is Ctrl+Alt+Del'd, I don't think there's any other way than to have a separate program that monitors the first's state. If you really need that much architecture, I think you'd want to be using a service and some client apps, or a pair or services.

This is assuming, though, that you've already looked into the Application events. If you haven't, check out this overview.

EDIT Better than that overview, probably, is the ApplicationExit event.

Chromatophore answered 21/7, 2009 at 3:43 Comment(1)
Both seem to be forms related, in this case this was actually a Console Application.Understand
A
1

The Finalize() method and Dispose() method are different things.

By default, Dispose would never be called. You would have to call it yourself from the Finalize method. Consider the following (ignoring the obvious failures in a proper finalize/dispose pattern here, for brevity):

public class Foo : IDisposable
{
    public void Dispose() 
    {
        // NOP
    }

    ~Foo()
    {
        Dispose();
    } 
}
Attorneyatlaw answered 20/1, 2015 at 19:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.