diff --git a/src/UiPath.Workflow/Activities/AsyncTaskCodeActivity.cs b/src/UiPath.Workflow/Activities/AsyncTaskCodeActivity.cs index 883d5be6..b911e578 100644 --- a/src/UiPath.Workflow/Activities/AsyncTaskCodeActivity.cs +++ b/src/UiPath.Workflow/Activities/AsyncTaskCodeActivity.cs @@ -1,68 +1,110 @@ // This file is part of Core WF which is licensed under the MIT license. // See LICENSE file in the project root for full license information. -using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using Nito.AsyncEx.Interop; namespace System.Activities; -public abstract class AsyncTaskCodeActivity : TaskCodeActivity + +/// +/// An asynchronous task-based +/// +public abstract class AsyncTaskCodeActivity : AsyncCodeActivity { - [EditorBrowsable(EditorBrowsableState.Never)] - [Browsable(false)] - public new object Result { get; set; } + protected override IAsyncResult BeginExecute + ( + AsyncCodeActivityContext context, + AsyncCallback callback, + object state + ) + { + var cts = new CancellationTokenSource(); + context.UserState = cts; - protected abstract Task ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken); + var task = ExecuteAsync(context, cts.Token); - private protected sealed override async Task ExecuteAsyncCore(AsyncCodeActivityContext context, - CancellationToken cancellationToken) - { - await ExecuteAsync(context, cancellationToken); - return null; + return ApmAsyncFactory.ToBegin(task, callback, state); } -} -public abstract class AsyncTaskCodeActivity : TaskCodeActivity -{ - protected abstract Task - ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken); + protected override void EndExecute + ( + AsyncCodeActivityContext context, + IAsyncResult result + ) + { + using ((CancellationTokenSource)context.UserState) + { + ((Task)result).Wait(); + } + } - private protected sealed override Task ExecuteAsyncCore(AsyncCodeActivityContext context, - CancellationToken cancellationToken) + protected override void Cancel(AsyncCodeActivityContext context) { - return ExecuteAsync(context, cancellationToken); + ((CancellationTokenSource)context.UserState).Cancel(); } + + /// + /// The operation executed at runtime. + /// + /// The context for this activity. + /// A cancellation token for this operation. + /// A representing the lifetime of this operation. + private protected abstract Task ExecuteAsync + ( + AsyncCodeActivityContext context, + CancellationToken cancellationToken + ); } -[EditorBrowsable(EditorBrowsableState.Never)] -public abstract class TaskCodeActivity : AsyncCodeActivity +/// +/// An asynchronous task-based . +/// +/// The type of the result this activity returns. +public abstract class AsyncTaskCodeActivity : AsyncCodeActivity { - protected sealed override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, - object state) + protected sealed override IAsyncResult BeginExecute + ( + AsyncCodeActivityContext context, + AsyncCallback callback, + object state + ) { var cts = new CancellationTokenSource(); context.UserState = cts; - var task = ExecuteAsyncCore(context, cts.Token); + var task = ExecuteAsync(context, cts.Token); return ApmAsyncFactory.ToBegin(task, callback, state); } - protected sealed override TResult EndExecute(AsyncCodeActivityContext context, IAsyncResult result) + protected sealed override TResult EndExecute + ( + AsyncCodeActivityContext context, + IAsyncResult result + ) { - using ((CancellationTokenSource) context.UserState) + using ((CancellationTokenSource)context.UserState) { - return ((Task) result).Result; + return ((Task)result).Result; } } protected sealed override void Cancel(AsyncCodeActivityContext context) { - ((CancellationTokenSource) context.UserState).Cancel(); + ((CancellationTokenSource)context.UserState).Cancel(); } - private protected abstract Task ExecuteAsyncCore(AsyncCodeActivityContext context, - CancellationToken cancellationToken); + /// + /// The operation executed at runtime. + /// + /// The context for this activity. + /// A cancellation token for this operation. + /// A representing the lifetime and containing the result of this operation. + private protected abstract Task ExecuteAsync + ( + AsyncCodeActivityContext context, + CancellationToken cancellationToken + ); }