UiPath自定义活动Async Task返回Tuple时OutArgument赋值报错如何解决
问题根因
该报错由异步活动的生命周期和闭包取值问题导致:ExecuteAsync方法执行完成后,原任务的上下文会被UiPath工作流运行时回收,你在返回的委托中直接访问外层task.Result时,已经无法正确读取到之前返回的Tuple类型结果,出现类型错位,触发类型不匹配的运行时错误。
修复方案
在await任务后将结果存入局部变量,再在返回的委托中使用该局部变量为输出参数赋值即可,修改后的ExecuteAsync代码如下:
protected override async Task<Action<AsyncCodeActivityContext>> ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken) { // Set a timeout on the execution var task = ExecuteWithTimeout(context, cancellationToken); Tuple<bool, SshClient, string> executionResult; if (await Task.WhenAny(task, Task.Delay(TimeoutMS.Get(context), cancellationToken)) == task) { // 将任务结果存入局部变量,避免后续闭包访问失效 executionResult = await task; } else { throw new TimeoutException(Resources.Timeout_Error); } // Outputs return (ctx) => { Connected.Set(ctx, executionResult.Item1); BaanConnection.Set(ctx, executionResult.Item2); Message.Set(ctx, executionResult.Item3); }; }
可选优化
如果你的项目使用C# 7及以上版本,可以将返回的Tuple替换为ValueTuple,使用自定义字段名代替.Item1、.Item2这类可读性较差的写法,降低后续维护成本。
内容的提问来源于stack exchange,提问作者user2157598
相关产品推荐
相关产品推荐

