void IActivityEventListener <ActivityExecutionStatusChangedEventArgs> .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e) { ActivityExecutionContext context = sender as ActivityExecutionContext; if (context == null) { throw new ArgumentException("sender"); } if (context.Activity.HasPrimaryClosed && context.Activity.LockCountOnStatusChange == 1) { // get exception Exception exception = (Exception)context.Activity.GetValue(ActivityExecutionContext.CurrentExceptionProperty); if (exception != null) { WorkflowTransactionOptions transactionOptions = TransactedContextFilter.GetTransactionOptions(context.Activity); if (transactionOptions != null) { // request revert to checkpoint state context.RequestRevertToCheckpointState(this.OnRevertInstanceState, new StateRevertedEventArgs(exception), false, null); } else { // release locks context.ReleaseLocks(false); context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this); context.Activity.ReleaseLockOnStatusChange(this); } } else { try { // 1st param is for transactional, means if the release lock on status change will try to persist the workflow instace // if that fails, then locks will be reacquired, otherwise they will be released. context.ReleaseLocks(true); context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this); context.Activity.ReleaseLockOnStatusChange(this); context.DisposeCheckpointState(); } catch { // re-subscribe context.Activity.RegisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this); throw; } } } }
public void OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e) { ActivityExecutionContext context = sender as ActivityExecutionContext; if (context.Activity.HasPrimaryClosed && (context.Activity.LockCountOnStatusChange == 1)) { context.ReleaseLocks(false); context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this); context.Activity.ReleaseLockOnStatusChange(this); } }
void IActivityEventListener <ActivityExecutionStatusChangedEventArgs> .OnEvent(object sender, ActivityExecutionStatusChangedEventArgs e) { ActivityExecutionContext context = sender as ActivityExecutionContext; if (context == null) { throw new ArgumentException("sender"); } if (context.Activity.HasPrimaryClosed && (context.Activity.LockCountOnStatusChange == 1)) { Exception exception = (Exception)context.Activity.GetValue(ActivityExecutionContext.CurrentExceptionProperty); if (exception != null) { if (GetTransactionOptions(context.Activity) != null) { context.RequestRevertToCheckpointState(new EventHandler <EventArgs>(this.OnRevertInstanceState), new StateRevertedEventArgs(exception), false, null); } else { context.ReleaseLocks(false); context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this); context.Activity.ReleaseLockOnStatusChange(this); } } else { try { context.ReleaseLocks(true); context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this); context.Activity.ReleaseLockOnStatusChange(this); context.DisposeCheckpointState(); } catch { context.Activity.RegisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this); throw; } } } }
private void OnRevertInstanceState(object sender, EventArgs e) { if (sender == null) { throw new ArgumentNullException("sender"); } if (e == null) { throw new ArgumentNullException("e"); } ActivityExecutionContext context = sender as ActivityExecutionContext; StateRevertedEventArgs args = e as StateRevertedEventArgs; context.Activity.SetValueCommon(ActivityExecutionContext.CurrentExceptionProperty, args.Exception, ActivityExecutionContext.CurrentExceptionProperty.DefaultMetadata, false); context.ReleaseLocks(false); context.Activity.UnregisterForStatusChange(Activity.LockCountOnStatusChangeChangedEvent, this); context.Activity.ReleaseLockOnStatusChange(this); }