Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Shared / MS / Internal / AppDomainShutdownMonitor.cs / 1 / 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
- ClientConvert.cs
- TabControlEvent.cs
- SafeNativeMethods.cs
- ThrowHelper.cs
- DataBindingHandlerAttribute.cs
- DataGridViewColumnDesignTimeVisibleAttribute.cs
- ZipIOExtraField.cs
- UnsafeNativeMethodsPenimc.cs
- TextRangeSerialization.cs
- TypeDelegator.cs
- EventPrivateKey.cs
- FatalException.cs
- NavigationProperty.cs
- SafeProcessHandle.cs
- Cursors.cs
- ArgumentNullException.cs
- WindowsBrush.cs
- MessageQueueEnumerator.cs
- AppDomain.cs
- followingsibling.cs
- _DigestClient.cs
- ChtmlTextWriter.cs
- PlainXmlSerializer.cs
- Enumerable.cs
- ObjectConverter.cs
- AssemblyBuilder.cs
- QuestionEventArgs.cs
- AttachInfo.cs
- InfoCardService.cs
- BridgeDataRecord.cs
- DocumentApplication.cs
- ActiveDocumentEvent.cs
- SqlRecordBuffer.cs
- ZoneLinkButton.cs
- MarshalByValueComponent.cs
- FormView.cs
- DataGridViewTextBoxCell.cs
- CounterSampleCalculator.cs
- TTSEngineProxy.cs
- CodeDirectoryCompiler.cs
- XmlException.cs
- VariableQuery.cs
- FamilyTypeface.cs
- HandleCollector.cs
- WebHeaderCollection.cs
- GiveFeedbackEvent.cs
- MemberBinding.cs
- VBIdentifierDesigner.xaml.cs
- XmlAttributeProperties.cs
- ClientTargetSection.cs
- SkinIDTypeConverter.cs
- TagPrefixInfo.cs
- SliderAutomationPeer.cs
- TextEndOfLine.cs
- HtmlSelect.cs
- RequestQueryParser.cs
- Dynamic.cs
- ApplicationSecurityManager.cs
- Slider.cs
- TemplateBindingExpressionConverter.cs
- Version.cs
- SoapWriter.cs
- NativeCompoundFileAPIs.cs
- TargetControlTypeAttribute.cs
- UpdatableGenericsFeature.cs
- CompoundFileStreamReference.cs
- GPPOINTF.cs
- Vector3dCollection.cs
- StringUtil.cs
- SecurityException.cs
- ConnectionConsumerAttribute.cs
- SetterBase.cs
- TableParaClient.cs
- TreeNodeClickEventArgs.cs
- ByteKeyFrameCollection.cs
- AsymmetricAlgorithm.cs
- Vector3DValueSerializer.cs
- XmlSchemaObjectCollection.cs
- RootBrowserWindow.cs
- ScrollChangedEventArgs.cs
- querybuilder.cs
- StorageScalarPropertyMapping.cs
- PerformanceCounter.cs
- DbConnectionPoolGroupProviderInfo.cs
- BindableTemplateBuilder.cs
- KernelTypeValidation.cs
- PrinterUnitConvert.cs
- WeakRefEnumerator.cs
- UpdatePanelTrigger.cs
- KeyPressEvent.cs
- KeyedCollection.cs
- ItemCollection.cs
- MsmqHostedTransportConfiguration.cs
- SessionSwitchEventArgs.cs
- wgx_render.cs
- SmtpClient.cs
- SecurityResources.cs
- HashRepartitionStream.cs
- BufferedReceiveElement.cs
- CodeObjectCreateExpression.cs