Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Filters / SynchronizationFilter.cs / 1305376 / SynchronizationFilter.cs
// ****************************************************************************
// Copyright (C) 2000-2001 Microsoft Corporation. All rights reserved.
//
// CONTENTS
// Synchronization Interceptor/Filter Executor
//
// DESCRIPTION
//
// ***************************************************************************
namespace System.Workflow.ComponentModel
{
using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Workflow.ComponentModel.Design;
internal sealed class SynchronizationFilter : ActivityExecutionFilter, IActivityEventListener, IActivityEventListener
{
public override ActivityExecutionStatus Execute(Activity activity, ActivityExecutionContext executionContext)
{
if (executionContext == null)
throw new ArgumentNullException("executionContext");
if (activity == null)
throw new ArgumentNullException("activity");
//Make sure first thing we do is hold lock on StatusChange.
activity.RegisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
activity.HoldLockOnStatusChange(this);
if (executionContext.AcquireLocks(this))
return ExecuteActivityNow(executionContext);
return activity.ExecutionStatus;
}
private ActivityExecutionStatus ExecuteActivityNow(ActivityExecutionContext context)
{
return ((ActivityExecutor)NextActivityExecutorInChain(context.Activity)).Execute(context.Activity, context);
}
#region IActivityEventListener Members
public void OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
{
ActivityExecutionContext context = sender as ActivityExecutionContext;
if (context.Activity.HasPrimaryClosed && context.Activity.LockCountOnStatusChange == 1)
{
// release locks and status change locks
context.ReleaseLocks(false);
context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
context.Activity.ReleaseLockOnStatusChange(this);
}
}
#endregion
#region IActivityEventListener Members
public void OnEvent(object sender, EventArgs e)
{
ActivityExecutionContext context = (ActivityExecutionContext)sender;
// only if activity is still executing, then run it
if (context.Activity.ExecutionStatus == ActivityExecutionStatus.Executing)
{
ActivityExecutionStatus newStatus = ExecuteActivityNow(context);
if (newStatus == ActivityExecutionStatus.Closed)
context.CloseActivity();
}
}
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
// ****************************************************************************
// Copyright (C) 2000-2001 Microsoft Corporation. All rights reserved.
//
// CONTENTS
// Synchronization Interceptor/Filter Executor
//
// DESCRIPTION
//
// ***************************************************************************
namespace System.Workflow.ComponentModel
{
using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Workflow.ComponentModel.Design;
internal sealed class SynchronizationFilter : ActivityExecutionFilter, IActivityEventListener, IActivityEventListener
{
public override ActivityExecutionStatus Execute(Activity activity, ActivityExecutionContext executionContext)
{
if (executionContext == null)
throw new ArgumentNullException("executionContext");
if (activity == null)
throw new ArgumentNullException("activity");
//Make sure first thing we do is hold lock on StatusChange.
activity.RegisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
activity.HoldLockOnStatusChange(this);
if (executionContext.AcquireLocks(this))
return ExecuteActivityNow(executionContext);
return activity.ExecutionStatus;
}
private ActivityExecutionStatus ExecuteActivityNow(ActivityExecutionContext context)
{
return ((ActivityExecutor)NextActivityExecutorInChain(context.Activity)).Execute(context.Activity, context);
}
#region IActivityEventListener Members
public void OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e)
{
ActivityExecutionContext context = sender as ActivityExecutionContext;
if (context.Activity.HasPrimaryClosed && context.Activity.LockCountOnStatusChange == 1)
{
// release locks and status change locks
context.ReleaseLocks(false);
context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this);
context.Activity.ReleaseLockOnStatusChange(this);
}
}
#endregion
#region IActivityEventListener Members
public void OnEvent(object sender, EventArgs e)
{
ActivityExecutionContext context = (ActivityExecutionContext)sender;
// only if activity is still executing, then run it
if (context.Activity.ExecutionStatus == ActivityExecutionStatus.Executing)
{
ActivityExecutionStatus newStatus = ExecuteActivityNow(context);
if (newStatus == ActivityExecutionStatus.Closed)
context.CloseActivity();
}
}
#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
- xml.cs
- TracePayload.cs
- ReflectEventDescriptor.cs
- GPRECT.cs
- EntityContainer.cs
- BindingExpressionBase.cs
- Dictionary.cs
- XmlSerializer.cs
- sqlcontext.cs
- CrossSiteScriptingValidation.cs
- Brush.cs
- SortDescription.cs
- ChannelPoolSettings.cs
- PublishLicense.cs
- CodeActivityMetadata.cs
- ListViewDeletedEventArgs.cs
- RequestDescription.cs
- DesignerOptionService.cs
- DBSchemaRow.cs
- TextCollapsingProperties.cs
- MailWriter.cs
- ComponentSerializationService.cs
- NativeMethods.cs
- SystemEvents.cs
- CrossAppDomainChannel.cs
- ScrollData.cs
- RowToParametersTransformer.cs
- _IPv6Address.cs
- ParserExtension.cs
- DispatcherExceptionFilterEventArgs.cs
- EntityType.cs
- WebPartCatalogCloseVerb.cs
- XPathPatternParser.cs
- ArraySegment.cs
- XmlSchemaSequence.cs
- IsolatedStorageFileStream.cs
- WebServiceParameterData.cs
- autovalidator.cs
- SafeLibraryHandle.cs
- StaticTextPointer.cs
- StylusEditingBehavior.cs
- CreateRefExpr.cs
- MediaContextNotificationWindow.cs
- CharacterMetrics.cs
- XmlSchemaGroupRef.cs
- XamlGridLengthSerializer.cs
- ApplicationGesture.cs
- Light.cs
- WebServiceClientProxyGenerator.cs
- RelationshipManager.cs
- EnumBuilder.cs
- SiteMapNode.cs
- OdbcCommand.cs
- GiveFeedbackEvent.cs
- NavigationProgressEventArgs.cs
- OperatingSystem.cs
- CellPartitioner.cs
- CornerRadius.cs
- GetImportFileNameRequest.cs
- BuildProvider.cs
- Win32.cs
- Compensate.cs
- CacheDependency.cs
- OAVariantLib.cs
- MobileUserControlDesigner.cs
- CodeDelegateInvokeExpression.cs
- RuleSettingsCollection.cs
- SqlConnectionPoolGroupProviderInfo.cs
- XPathSingletonIterator.cs
- ButtonRenderer.cs
- SyndicationPerson.cs
- Point4DValueSerializer.cs
- BoolExpr.cs
- MetadataCacheItem.cs
- XmlStreamStore.cs
- GridViewRowPresenterBase.cs
- XmlDictionaryReaderQuotas.cs
- DesignerAutoFormat.cs
- ProcessThreadCollection.cs
- ServiceChannel.cs
- DataTableReader.cs
- XmlSchemaException.cs
- Rotation3DKeyFrameCollection.cs
- ProfileService.cs
- EntityDataSourceDataSelectionPanel.cs
- StreamSecurityUpgradeAcceptor.cs
- InfoCardRSAPKCS1SignatureFormatter.cs
- XamlSerializationHelper.cs
- OpenFileDialog.cs
- ButtonBase.cs
- BrowserDefinitionCollection.cs
- CodeRemoveEventStatement.cs
- InputLanguageCollection.cs
- ButtonFieldBase.cs
- EntityDataSourceSelectingEventArgs.cs
- XamlParser.cs
- ZipIOExtraFieldZip64Element.cs
- DataGridViewLayoutData.cs
- SystemMulticastIPAddressInformation.cs
- DataControlCommands.cs