Hi Simon,
The answer to your questions is "Yes and No".
I'll
explain both below:
Yes: Finalizers will be called when the application domain
is shutting down
and/or when the CLR is shutting down. You can determine if
this is the case
by referencing the Environment.HasShutdownStarted property.
Although it is
unwise to reference other objects in one's finalizer, in
some cases folks
attempt to access static objects in their finalizer assuming
that, since
they are static, they will be available. However, instead
of making such a
bold assumption, those folks should gate their access to
those static
objects based on the return of the HasShutdownStarted
property. Because
when that guy returns true, those static objects may already
have been
finalized.
No: Finalizers may not ever be called on all objects if
your application
runs as a system service and the system is shutting down!!!!
This depends
on various factors, including the version of the OS. For
example, at the
native level, services receive the SERVICE_CONTROL_SHUTDOWN
notification.
However, on 2000/XP/2003, for example, that notification is
of limited use
because you only have about 20 seconds to get any useful
work done. When
that 20 seconds times out, your service process is
*terminated* rudely. So,
you can imagine that if you have a managed app running as a
service and the
finalizers need to do a lot of clean-up during process
shutdown, the work
may not complete before the service is terminated. Now,
that said,
Microsoft has introduced a new native service notification
starting with
Vista called SERVICE_CONTROL_PRESHUTDOWN. As you can
imagine, this notifies
the service that the system is about to shut down and gives
the service as
much time as it needs to clean up. However, I don't know if
the Microsoft
CLR implementations make use of this new notification on the
Vista and
Windows 2008 platforms.
Hope this helps,
-Trey
---------------------------------------
Trey Nash
Check out my book "Accelerated C# 2008"
http://www.amazon.com/Accelerated-C-2008-Trey-Na
sh/dp/1590598733
> -----Original Message-----
> From: Discussion of advanced .NET topics.
[mailto:ADVANCED-
> DOTNET DISCUSS.DEVELOP.COM] On Behalf Of Simon Robinson
> Sent: Friday, September 19, 2008 6:55 AM
> To: ADVANCED-DOTNET DISCUSS.DEVELOP.COM
> Subject: Re: [ADVANCED-DOTNET] Unmanaged resources in a
static class
>
> Thanks for the replies everyone. Static reference to
an instance does
> sound on the surface to be the easiest solution. I have
one doubt
> though:
> It's occurred to me to wonder whether finalizers are
guaranteed to be
> executed when the app exits? They are executed when a
garbage
> collection
> happens but that's not the same thing. Does .NET do a
garbage
> collection
> on app exit or does it just rely on Windows freeing up
everything? If
> it
> doesn't then keeping a static reference presumably
won't make any
> difference.
>
> Ta
>
> Simon
>
> On Wed, 17 Sep 2008 19:33:14 -0700, Greg Young
> <gregoryyoung1 GMAIL.COM>
> wrote:
>
> >why not keep a static reference to an instance of
the class instead of
> >using a static class?
> >
> >Cheers,
> >
> >Greg
>
> ===================================
> This list is hosted by DevelopMentorR http://www.develop.com
>
> View archives and manage your subscription(s) at
> http://discuss.develop.com
===================================
This list is hosted by DevelopMentorŪ http://www.develop.com
View archives and manage your subscription(s) at http://discuss.develop.com
|