Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Shared / MS / Internal / AppDomainShutdownMonitor.cs / 1305600 / AppDomainShutdownMonitor.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // Implement IAddDomainShutdownListener and use AppDomainShutdownMonitor // to know when the AppDomain is going down // //--------------------------------------------------------------------------- using System; using System.Diagnostics; // Assert using System.Collections.Generic; // Dictionary using System.Threading; // [ThreadStatic] namespace MS.Internal { internal interface IAppDomainShutdownListener { void NotifyShutdown(); } internal static class AppDomainShutdownMonitor { static AppDomainShutdownMonitor() { AppDomain.CurrentDomain.DomainUnload += OnShutdown; AppDomain.CurrentDomain.ProcessExit += OnShutdown; _dictionary = new Dictionary(); } public static void Add(WeakReference listener) { Debug.Assert(listener.Target != null); Debug.Assert(listener.Target is IAppDomainShutdownListener); lock (_dictionary) { if (!_shuttingDown) { _dictionary.Add(listener, listener); } } } public static void Remove(WeakReference listener) { Debug.Assert(listener.Target == null || listener.Target is IAppDomainShutdownListener); lock (_dictionary) { if (!_shuttingDown) { _dictionary.Remove(listener); } } } private static void OnShutdown(object sender, EventArgs e) { lock (_dictionary) { // Setting this to true prevents Add and Remove from modifying the list. This // way we call out without holding a lock (which would be bad) _shuttingDown = true; } foreach (WeakReference value in _dictionary.Values) { IAppDomainShutdownListener listener = value.Target as IAppDomainShutdownListener; if (listener != null) { listener.NotifyShutdown(); } } } private static Dictionary _dictionary; private static bool _shuttingDown; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // // // Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // Implement IAddDomainShutdownListener and use AppDomainShutdownMonitor // to know when the AppDomain is going down // //--------------------------------------------------------------------------- using System; using System.Diagnostics; // Assert using System.Collections.Generic; // Dictionary using System.Threading; // [ThreadStatic] namespace MS.Internal { internal interface IAppDomainShutdownListener { void NotifyShutdown(); } internal static class AppDomainShutdownMonitor { static AppDomainShutdownMonitor() { AppDomain.CurrentDomain.DomainUnload += OnShutdown; AppDomain.CurrentDomain.ProcessExit += OnShutdown; _dictionary = new Dictionary(); } public static void Add(WeakReference listener) { Debug.Assert(listener.Target != null); Debug.Assert(listener.Target is IAppDomainShutdownListener); lock (_dictionary) { if (!_shuttingDown) { _dictionary.Add(listener, listener); } } } public static void Remove(WeakReference listener) { Debug.Assert(listener.Target == null || listener.Target is IAppDomainShutdownListener); lock (_dictionary) { if (!_shuttingDown) { _dictionary.Remove(listener); } } } private static void OnShutdown(object sender, EventArgs e) { lock (_dictionary) { // Setting this to true prevents Add and Remove from modifying the list. This // way we call out without holding a lock (which would be bad) _shuttingDown = true; } foreach (WeakReference value in _dictionary.Values) { IAppDomainShutdownListener listener = value.Target as IAppDomainShutdownListener; if (listener != null) { listener.NotifyShutdown(); } } } private static Dictionary _dictionary; private static bool _shuttingDown; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PerfCounters.cs
- _BasicClient.cs
- QueryOperationResponseOfT.cs
- GeometryHitTestParameters.cs
- CodeObject.cs
- NaturalLanguageHyphenator.cs
- WaitHandleCannotBeOpenedException.cs
- loginstatus.cs
- HttpException.cs
- DataStreamFromComStream.cs
- _BaseOverlappedAsyncResult.cs
- EmptyTextWriter.cs
- CompiledIdentityConstraint.cs
- ValidationPropertyAttribute.cs
- SingletonChannelAcceptor.cs
- CompiledQueryCacheKey.cs
- TextReader.cs
- PeerCredentialElement.cs
- ReadingWritingEntityEventArgs.cs
- ParameterCollection.cs
- IDQuery.cs
- PolygonHotSpot.cs
- SchemaCollectionCompiler.cs
- BulletedListEventArgs.cs
- securestring.cs
- AndCondition.cs
- PropertyItem.cs
- RegionData.cs
- ParseElement.cs
- PeerInvitationResponse.cs
- DataColumnCollection.cs
- ParameterDataSourceExpression.cs
- AsymmetricAlgorithm.cs
- InputBuffer.cs
- DataGridViewCellValidatingEventArgs.cs
- PersonalizablePropertyEntry.cs
- SecurityPolicySection.cs
- HtmlToClrEventProxy.cs
- RowParagraph.cs
- SignedInfo.cs
- DeriveBytes.cs
- RegexRunner.cs
- DataControlCommands.cs
- FirstQueryOperator.cs
- XmlSchemaParticle.cs
- Light.cs
- WebConfigurationHostFileChange.cs
- Style.cs
- ReferencedAssembly.cs
- ArgumentException.cs
- SourceInterpreter.cs
- ControlCollection.cs
- WhitespaceRuleLookup.cs
- RawAppCommandInputReport.cs
- HttpChannelHelper.cs
- GacUtil.cs
- PolicyStatement.cs
- TraceContextEventArgs.cs
- FormattedText.cs
- XmlQueryTypeFactory.cs
- SpecialTypeDataContract.cs
- DataGridViewRowPostPaintEventArgs.cs
- TransactionInformation.cs
- CompositeFontParser.cs
- AttachmentCollection.cs
- CodeDirectionExpression.cs
- AspNetRouteServiceHttpHandler.cs
- Internal.cs
- XmlReflectionMember.cs
- PolyQuadraticBezierSegment.cs
- SqlCacheDependency.cs
- IPAddress.cs
- PathSegment.cs
- PreProcessor.cs
- TransactionOptions.cs
- SimpleTypeResolver.cs
- HostingEnvironmentSection.cs
- FullTextState.cs
- UnsafeNativeMethods.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- SHA384.cs
- HttpPostedFileBase.cs
- ListBoxChrome.cs
- Color.cs
- HttpsHostedTransportConfiguration.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- OdbcTransaction.cs
- DbConnectionPoolGroup.cs
- ContentElement.cs
- BaseProcessor.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- NetTcpSection.cs
- OdbcInfoMessageEvent.cs
- UniqueID.cs
- QueryBranchOp.cs
- SoapUnknownHeader.cs
- DataGridViewLayoutData.cs
- tooltip.cs
- Separator.cs
- DiagnosticsConfiguration.cs