Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- InitializeCorrelation.cs
- ChunkedMemoryStream.cs
- ScriptHandlerFactory.cs
- FolderNameEditor.cs
- WebPartConnectionsEventArgs.cs
- JournalEntryStack.cs
- ObjectTag.cs
- SizeFConverter.cs
- Tuple.cs
- ParenthesizePropertyNameAttribute.cs
- COM2PictureConverter.cs
- VirtualDirectoryMapping.cs
- Int16KeyFrameCollection.cs
- QueryOperator.cs
- Overlapped.cs
- HttpHandlerAction.cs
- ClientBuildManagerTypeDescriptionProviderBridge.cs
- ScriptMethodAttribute.cs
- OrderedDictionary.cs
- ValidationVisibilityAttribute.cs
- DynamicValueConverter.cs
- ConfigurationProperty.cs
- BitmapMetadata.cs
- ConfigurationLocation.cs
- TraceListeners.cs
- ContractsBCL.cs
- PropertyDescriptorGridEntry.cs
- columnmapkeybuilder.cs
- MessageQuerySet.cs
- WinFormsUtils.cs
- TearOffProxy.cs
- HierarchicalDataSourceControl.cs
- EllipseGeometry.cs
- CqlQuery.cs
- ToolStripItemClickedEventArgs.cs
- ConnectionPoint.cs
- DataGridViewRowEventArgs.cs
- SafeRegistryHandle.cs
- TextInfo.cs
- backend.cs
- BinHexDecoder.cs
- EditCommandColumn.cs
- ExpressionNormalizer.cs
- LineServicesCallbacks.cs
- DependencyPropertyKind.cs
- EmbeddedMailObjectsCollection.cs
- RbTree.cs
- SessionParameter.cs
- FillBehavior.cs
- CompressionTransform.cs
- SqlAliaser.cs
- SqlProfileProvider.cs
- CompiledAction.cs
- OracleBoolean.cs
- SchemaNamespaceManager.cs
- CellQuery.cs
- dataSvcMapFileLoader.cs
- StatusBarDrawItemEvent.cs
- Vector3DAnimation.cs
- Stack.cs
- DBCSCodePageEncoding.cs
- BindToObject.cs
- AxisAngleRotation3D.cs
- PtsContext.cs
- IntPtr.cs
- UIElement3DAutomationPeer.cs
- HandleExceptionArgs.cs
- TryExpression.cs
- WmlPanelAdapter.cs
- LifetimeServices.cs
- UseManagedPresentationBindingElementImporter.cs
- CorePropertiesFilter.cs
- UnaryNode.cs
- Input.cs
- ProvideValueServiceProvider.cs
- FontStyle.cs
- SignedInfo.cs
- Merger.cs
- IgnoreSectionHandler.cs
- ToolStripMenuItem.cs
- Glyph.cs
- XmlElementList.cs
- OutputCacheModule.cs
- WebPartExportVerb.cs
- ValidatorCompatibilityHelper.cs
- Validator.cs
- ProxyWebPartConnectionCollection.cs
- BinaryParser.cs
- ipaddressinformationcollection.cs
- DragDrop.cs
- EntryPointNotFoundException.cs
- ComboBox.cs
- ToolStripSplitButton.cs
- InputLanguageEventArgs.cs
- UpDownBase.cs
- XmlSchemaCompilationSettings.cs
- BitmapCodecInfoInternal.cs
- ColumnWidthChangedEvent.cs
- WorkflowTransactionOptions.cs
- ipaddressinformationcollection.cs