Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / RunTime / TimerEventSubscriptionCollection.cs / 1305376 / TimerEventSubscriptionCollection.cs
using System; using System.Collections.Generic; using System.Text; using System.Workflow.Runtime.Hosting; using System.Workflow.ComponentModel; using System.Diagnostics; using System.Collections; namespace System.Workflow.Runtime { [Serializable] public class TimerEventSubscriptionCollection : ICollection { public readonly static DependencyProperty TimerCollectionProperty = DependencyProperty.RegisterAttached("TimerCollection", typeof(TimerEventSubscriptionCollection), typeof(TimerEventSubscriptionCollection)); private object locker = new Object(); private KeyedPriorityQueuequeue = new KeyedPriorityQueue (); #pragma warning disable 0414 private bool suspended = false; // no longer used but required for binary compatibility of serialization format #pragma warning restore 0414 [NonSerialized] private IWorkflowCoreRuntime executor; private Guid instanceId; internal TimerEventSubscriptionCollection(IWorkflowCoreRuntime executor, Guid instanceId) { this.executor = executor; this.instanceId = instanceId; WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Created", instanceId); this.queue.FirstElementChanged += OnFirstElementChanged; } internal void Enqueue(TimerEventSubscription timerEventSubscription) { lock (locker) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Enqueue Timer {1} for {2} ", instanceId, timerEventSubscription.SubscriptionId, timerEventSubscription.ExpiresAt); queue.Enqueue(timerEventSubscription.SubscriptionId, timerEventSubscription, timerEventSubscription.ExpiresAt); } } internal IWorkflowCoreRuntime Executor { get { return executor; } set { executor = value; } } public TimerEventSubscription Peek() { lock (locker) { return queue.Peek(); } } internal TimerEventSubscription Dequeue() { lock (locker) { TimerEventSubscription retval = queue.Dequeue(); if(retval != null) WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Dequeue Timer {1} for {2} ", instanceId, retval.SubscriptionId, retval.ExpiresAt); return retval; } } public void Remove(Guid timerSubscriptionId) { lock (locker) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Remove Timer {1}", instanceId, timerSubscriptionId); queue.Remove(timerSubscriptionId); } } private void OnFirstElementChanged(object source, KeyedPriorityQueueHeadChangedEventArgs e) { lock (locker) { ITimerService timerService = this.executor.GetService(typeof(ITimerService)) as ITimerService; if (e.NewFirstElement != null && executor != null) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Schedule Timer {1} for {2} ", instanceId, e.NewFirstElement.SubscriptionId, e.NewFirstElement.ExpiresAt); timerService.ScheduleTimer(executor.ProcessTimersCallback, e.NewFirstElement.WorkflowInstanceId, e.NewFirstElement.ExpiresAt, e.NewFirstElement.SubscriptionId); } if (e.OldFirstElement != null) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Unschedule Timer {1} for {2} ", instanceId, e.OldFirstElement.SubscriptionId, e.OldFirstElement.ExpiresAt); timerService.CancelTimer(e.OldFirstElement.SubscriptionId); } } } internal void SuspendDelivery() { lock (locker) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Suspend", instanceId); WorkflowSchedulerService schedulerService = this.executor.GetService(typeof(WorkflowSchedulerService)) as WorkflowSchedulerService; TimerEventSubscription sub = queue.Peek(); if (sub != null) { schedulerService.Cancel(sub.SubscriptionId); } } } internal void ResumeDelivery() { lock (locker) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Resume", instanceId); WorkflowSchedulerService schedulerService = this.executor.GetService(typeof(WorkflowSchedulerService)) as WorkflowSchedulerService; TimerEventSubscription sub = queue.Peek(); if (sub != null) { schedulerService.Schedule(executor.ProcessTimersCallback, sub.WorkflowInstanceId, sub.ExpiresAt, sub.SubscriptionId); } } } public void Add(TimerEventSubscription item) { if (item == null) throw new ArgumentNullException("item"); this.Enqueue(item); } public void Remove(TimerEventSubscription item) { if (item == null) throw new ArgumentNullException("item"); this.Remove(item.SubscriptionId); } #region ICollection Members public void CopyTo(Array array, int index) { TimerEventSubscription[] tes = null; lock (locker) { tes = new TimerEventSubscription[queue.Count]; queue.Values.CopyTo(tes, 0); } if(tes != null) tes.CopyTo(array, index); } public int Count { get { return queue.Count; } } public bool IsSynchronized { get { return true; } } public object SyncRoot { get { return locker; } } #endregion #region IEnumerable Members public IEnumerator GetEnumerator() { return queue.Values.GetEnumerator(); } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections.Generic; using System.Text; using System.Workflow.Runtime.Hosting; using System.Workflow.ComponentModel; using System.Diagnostics; using System.Collections; namespace System.Workflow.Runtime { [Serializable] public class TimerEventSubscriptionCollection : ICollection { public readonly static DependencyProperty TimerCollectionProperty = DependencyProperty.RegisterAttached("TimerCollection", typeof(TimerEventSubscriptionCollection), typeof(TimerEventSubscriptionCollection)); private object locker = new Object(); private KeyedPriorityQueue queue = new KeyedPriorityQueue (); #pragma warning disable 0414 private bool suspended = false; // no longer used but required for binary compatibility of serialization format #pragma warning restore 0414 [NonSerialized] private IWorkflowCoreRuntime executor; private Guid instanceId; internal TimerEventSubscriptionCollection(IWorkflowCoreRuntime executor, Guid instanceId) { this.executor = executor; this.instanceId = instanceId; WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Created", instanceId); this.queue.FirstElementChanged += OnFirstElementChanged; } internal void Enqueue(TimerEventSubscription timerEventSubscription) { lock (locker) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Enqueue Timer {1} for {2} ", instanceId, timerEventSubscription.SubscriptionId, timerEventSubscription.ExpiresAt); queue.Enqueue(timerEventSubscription.SubscriptionId, timerEventSubscription, timerEventSubscription.ExpiresAt); } } internal IWorkflowCoreRuntime Executor { get { return executor; } set { executor = value; } } public TimerEventSubscription Peek() { lock (locker) { return queue.Peek(); } } internal TimerEventSubscription Dequeue() { lock (locker) { TimerEventSubscription retval = queue.Dequeue(); if(retval != null) WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Dequeue Timer {1} for {2} ", instanceId, retval.SubscriptionId, retval.ExpiresAt); return retval; } } public void Remove(Guid timerSubscriptionId) { lock (locker) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Remove Timer {1}", instanceId, timerSubscriptionId); queue.Remove(timerSubscriptionId); } } private void OnFirstElementChanged(object source, KeyedPriorityQueueHeadChangedEventArgs e) { lock (locker) { ITimerService timerService = this.executor.GetService(typeof(ITimerService)) as ITimerService; if (e.NewFirstElement != null && executor != null) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Schedule Timer {1} for {2} ", instanceId, e.NewFirstElement.SubscriptionId, e.NewFirstElement.ExpiresAt); timerService.ScheduleTimer(executor.ProcessTimersCallback, e.NewFirstElement.WorkflowInstanceId, e.NewFirstElement.ExpiresAt, e.NewFirstElement.SubscriptionId); } if (e.OldFirstElement != null) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Unschedule Timer {1} for {2} ", instanceId, e.OldFirstElement.SubscriptionId, e.OldFirstElement.ExpiresAt); timerService.CancelTimer(e.OldFirstElement.SubscriptionId); } } } internal void SuspendDelivery() { lock (locker) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Suspend", instanceId); WorkflowSchedulerService schedulerService = this.executor.GetService(typeof(WorkflowSchedulerService)) as WorkflowSchedulerService; TimerEventSubscription sub = queue.Peek(); if (sub != null) { schedulerService.Cancel(sub.SubscriptionId); } } } internal void ResumeDelivery() { lock (locker) { WorkflowTrace.Host.TraceEvent(TraceEventType.Information, 0, "TimerEventSubscriptionQueue: {0} Resume", instanceId); WorkflowSchedulerService schedulerService = this.executor.GetService(typeof(WorkflowSchedulerService)) as WorkflowSchedulerService; TimerEventSubscription sub = queue.Peek(); if (sub != null) { schedulerService.Schedule(executor.ProcessTimersCallback, sub.WorkflowInstanceId, sub.ExpiresAt, sub.SubscriptionId); } } } public void Add(TimerEventSubscription item) { if (item == null) throw new ArgumentNullException("item"); this.Enqueue(item); } public void Remove(TimerEventSubscription item) { if (item == null) throw new ArgumentNullException("item"); this.Remove(item.SubscriptionId); } #region ICollection Members public void CopyTo(Array array, int index) { TimerEventSubscription[] tes = null; lock (locker) { tes = new TimerEventSubscription[queue.Count]; queue.Values.CopyTo(tes, 0); } if(tes != null) tes.CopyTo(array, index); } public int Count { get { return queue.Count; } } public bool IsSynchronized { get { return true; } } public object SyncRoot { get { return locker; } } #endregion #region IEnumerable Members public IEnumerator GetEnumerator() { return queue.Values.GetEnumerator(); } #endregion } } // 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
- ElementProxy.cs
- SettingsContext.cs
- EastAsianLunisolarCalendar.cs
- DynamicDataManager.cs
- BinHexEncoder.cs
- HttpException.cs
- ObfuscationAttribute.cs
- ColorTransform.cs
- ByteAnimationBase.cs
- AccessibilityApplicationManager.cs
- SQLGuidStorage.cs
- FixedFlowMap.cs
- InfoCardSymmetricCrypto.cs
- CompilerCollection.cs
- ConnectionPointGlyph.cs
- ModuleElement.cs
- ConfigXmlSignificantWhitespace.cs
- XamlSerializerUtil.cs
- StickyNoteAnnotations.cs
- EventArgs.cs
- WindowsStreamSecurityBindingElement.cs
- BlurBitmapEffect.cs
- WebPart.cs
- SystemIPInterfaceStatistics.cs
- BinaryMessageEncoder.cs
- DependencyPropertyValueSerializer.cs
- Schema.cs
- PreProcessInputEventArgs.cs
- CqlBlock.cs
- ChangeNode.cs
- Trigger.cs
- InputQueueChannel.cs
- WorkflowDefinitionContext.cs
- ObservableDictionary.cs
- X509CertificateTrustedIssuerElementCollection.cs
- GridViewDeletedEventArgs.cs
- Setter.cs
- WmlPageAdapter.cs
- LayoutDump.cs
- CharEntityEncoderFallback.cs
- Task.cs
- LabelLiteral.cs
- ParallelTimeline.cs
- PtsHost.cs
- UIElement3D.cs
- ParseNumbers.cs
- WebPartEditorApplyVerb.cs
- SessionStateUtil.cs
- FontInfo.cs
- ObjectConverter.cs
- RoamingStoreFile.cs
- CustomValidator.cs
- RelationshipEndMember.cs
- DocumentsTrace.cs
- NodeLabelEditEvent.cs
- ConfigViewGenerator.cs
- Rectangle.cs
- DataGridViewComboBoxColumn.cs
- RetrieveVirtualItemEventArgs.cs
- InstrumentationTracker.cs
- NameValueConfigurationElement.cs
- ReadOnlyDictionary.cs
- SerializationInfoEnumerator.cs
- WindowsEditBox.cs
- LinqDataSourceInsertEventArgs.cs
- StackOverflowException.cs
- ContentElement.cs
- TextFindEngine.cs
- XmlSchemaInfo.cs
- DiscoveryEndpoint.cs
- DataGridTextBoxColumn.cs
- SessionStateModule.cs
- FontWeight.cs
- ExceptionHandlerDesigner.cs
- TaiwanCalendar.cs
- XmlnsDictionary.cs
- RecognitionResult.cs
- KeyValueInternalCollection.cs
- DynamicDataManager.cs
- MailMessageEventArgs.cs
- GPPOINTF.cs
- ACL.cs
- DefaultAssemblyResolver.cs
- HostingEnvironment.cs
- BinaryNode.cs
- MulticastDelegate.cs
- GroupItemAutomationPeer.cs
- OperationInvokerTrace.cs
- UnknownBitmapDecoder.cs
- EntityDataSourceColumn.cs
- SmtpMail.cs
- RowUpdatedEventArgs.cs
- SchemaObjectWriter.cs
- MenuEventArgs.cs
- Rect3DValueSerializer.cs
- ApplySecurityAndSendAsyncResult.cs
- DocumentPageView.cs
- PresentationTraceSources.cs
- Attributes.cs
- SqlBulkCopyColumnMapping.cs