Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

Status
colourYellow
titleWMS 2020 (1.0.3)

Die WmsAsyncCodeActivity ist eine Ableitung der herkömmlichen AsyncCodeActivity (System.Activities.AsyncCodeActivity). Sie erweitert die Klasse um folgende Funktionalität:

  • Deaktivieren von Aktivitäten über das Disabled-Property 
  • Fehlerbehandlung
  • Disposable
  • Prüfen, ob es eine neuere Version der Aktivität gibt (SupersedesAttribute)

     

    Unterschiede zur System.Activities.AsyncCodeActivity

    • Statt der BeginExecute-Methode implementieren Sie die BeginExectuteIntern-Methode 
    • Statt der EndExecute-Methode implementieren Sie die OnTaskExecuted-Methode
    • Zusätzliches Property "Disabled"
    • Implementiert IDisposable

    Seite einschließen
    Basisklassen für Aktivitäten
    Basisklassen für Aktivitäten


    Codeblock
    languagec#
    titleWmsAsyncCodeActivity (C#)
    linenumberstrue
    collapsetrue
    using System;
    using System.Activities;
    using System.Runtime.ExceptionServices;
    using System.Threading;
    using System.Threading.Tasks;
    using Accantum.Wms.ActivityContracts.Attributes;
    using Accantum.Wms.ActivityContracts.Properties;
    
    namespace Accantum.Wms.ActivityContracts.Base
    {
        /// <summary>
        /// Basisklasse für asynchrone Aktivitäten
        /// </summary>
        /// <typeparam name="T">Typ den der Task zurückliefert</typeparam>
        public abstract class WmsAsyncCodeActivity<T> : AsyncCodeActivity, IWmsActivityBase
        {
            /// <summary>
            /// Kennzeichen, ob die Aktivität auskommentiert ist. Wenn Ja, wird die ExecuteMethode nicht aufgerufen.
            /// </summary>
            [ExcludeInAnnotation]
            [LocalizedDisplayName("Activity_Disabled", typeof(WmsActivityResources))]
            [LocalizedDescription("Activity_DisabledDesc", typeof(WmsActivityResources))]
            public bool Disabled { get; set; }
    
            /// <summary>
            /// prüft die Aktivitätsversion (<see cref="SupersedesAttribute"/>) und das Disabled-Property
            /// </summary>
            protected override void CacheMetadata(CodeActivityMetadata a_oMetadata)
            {   
                //Bei deaktivierten Aktivitäten Fehler nicht anzeigen
                if (Disabled)
                {
    				a_oMetadata.SetValidationErrorsCollection(null);
    			    a_oMetadata.AddValidationError(CreateDisabledValidationWarning());
    			}
    			else {
    				base.CacheMetadata(a_oMetadata);
    			}
                SupersedesAttribute.AddWarningIfIsSuperseded(GetType(), a_oMetadata);                 
            }
    
            /// <summary>
            /// Methode wird vor der Ausführung aufgerufen und prüft das Disabled-Kennzeichen. 
            /// </summary>
            /// <returns>true, wenn die Aktivität ausgeführt werden soll.</returns>
            protected virtual bool BeforeExecute(AsyncCodeActivityContext context)
            {
                if (!Disabled) 
                    return true;
    
                var wmsApi = context.GetExtension<IWmsApiExtension>();
                wmsApi.TrackInfo(context, GetDisabledWarning());
                return false;
            }
    
    
            protected sealed override IAsyncResult BeginExecute(AsyncCodeActivityContext a_oContext, AsyncCallback a_oCallback, object a_oState)
            {
                if (!BeforeExecute(a_oContext))
                    return Task.FromResult(default(T));
    
                try
                {
                    return BeginExecuteIntern(a_oContext, a_oCallback, a_oState);
                }
                catch (Exception ex)
                {
                    DisposeObjects(a_oContext.UserState);
                    return FromTask(Task.FromException<T>(ex), a_oCallback, a_oState);
                }
            }
    
            protected abstract IAsyncResult BeginExecuteIntern(AsyncCodeActivityContext a_oContext, AsyncCallback a_oCallback, object a_oState);
    
            /// <summary>
            /// Erzeugt aus einem Task ein IAsyncResult und beinhaltet Fehlerbehandlung 
            /// </summary>
            protected IAsyncResult FromTask(Task<T> a_oTask, AsyncCallback a_oCallback, object a_oState)
            {
                ...
            }
    
            protected sealed override void EndExecute(AsyncCodeActivityContext a_oContext, IAsyncResult a_oResult)
            {
                var oTask = a_oResult as Task<T>;
                try
                {
                    OnTaskExecuted(a_oContext, oTask != null ? oTask.Result : default, a_oResult);
                }
                catch (AggregateException ex)
                {
                    ...
                }
                finally
                {
                    DisposeObjects(a_oContext.UserState);
                }
            }
    
            
            protected override void Cancel(AsyncCodeActivityContext a_oContext)
            {
                // Implement any cleanup as a result of the asynchronous work
                // being canceled, and then call MarkCanceled.
                if (a_oContext.IsCancellationRequested)
                    a_oContext.MarkCanceled();
    
                DisposeObjects(a_oContext.UserState);
            }
    
            protected abstract void OnTaskExecuted(AsyncCodeActivityContext a_oContext, T a_oTaskResult, IAsyncResult a_oResult);
    
            protected virtual void DisposeObjects(object a_oUserState)
            {
                (a_oUserState as IDisposable)?.Dispose();
            }
    
        }
    }