You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建包含同步Action与异步Func<Task>的混合数组?

解决同步与异步任务并存入同一数组的问题

你可以通过两种方式实现同步Action和异步Func<Task>的统一存储:

方案一:统一包装为Func<Task>

直接将同步方法包装成返回已完成任务的异步委托,就能和原生异步方法存入同一个Func<Task>数组:

Task A() => Task.Delay(1);
void B() => Console.WriteLine("B");

// 包装同步方法为异步委托
Func<Task> Wrap(Action action) => () => { action(); return Task.CompletedTask; };

var functions = new Func<Task>[] { A, Wrap(B) };

遍历执行时直接await每个委托即可,同步方法会同步执行后返回已完成任务,不影响流程的顺序执行与失败终止逻辑。

方案二:正确实现Step类的隐式转换

如果想用自定义类统一管理,需确保Step类封装执行逻辑并正确实现隐式运算符。以下是可行的实现:

public class Step
{
    private readonly Func<Task> _execute;

    private Step(Func<Task> execute)
    {
        _execute = execute;
    }

    public Task ExecuteAsync()
    {
        return _execute();
    }

    // 从异步委托隐式转换
    public static implicit operator Step(Func<Task> func)
    {
        return new Step(func);
    }

    // 从同步委托隐式转换
    public static implicit operator Step(Action action)
    {
        return new Step(() => { action(); return Task.CompletedTask; });
    }
}

使用时直接将Action和Func<Task>赋值给Step数组即可:

Task A() => Task.Delay(1);
void B() => Console.WriteLine("B");

var steps = new Step[] { A, B };

// 执行流程示例
foreach (var step in steps)
{
    try
    {
        await step.ExecuteAsync();
        // 记录步骤执行成功
    }
    catch (Exception ex)
    {
        // 记录失败并终止流程
        break;
    }
}

你之前实现失败大概率是因为Step类未正确封装异步执行逻辑,或是隐式转换未将同步方法包装为异步委托。

内容的提问来源于stack exchange,提问作者Darren Oakey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:41:01