异步功能正在等待

时间:2018-07-11 01:11:48

标签: c# delegates async-await

我正在编写一个包装函数,该函数执行任意数量的异步任务,并将提供重试和错误处理策略。我在等待异步任务结果时遇到问题。

方法调用如下:

Execute(async () => await someAsyncFunction(someValue), async () await someOtherFunction(someValue))

我的方法实现如下:

void Execute<T1, T2>(Func<T1> fn1, Func<T2> fn2, ... /* overloads for up to 6 functions */)
{
    fn1();
    fn2();
    /* ... */
}

我还没有应用错误处理和重试策略,但是从调试中,我注意到立即跳过fn1或fn2是立即的,即使我在例如大延迟的情况下也是如此:

async Task someAsyncFunction(object value)
{
    await Task.Delay(10000);
    //...
}

是否可以用异步方法实现我想要的?

1 个答案:

答案 0 :(得分:2)

异步“操作”实际上是一个返回Task的函数,因此它将是一个Func<Task>。您可以创建任务集合,然后使用Task.WhenAll等待所有任务。您可以使用params关键字来提供数量灵活的参数。

还请注意,Execute()本身必须是异步的才能进行异步调用。

public class Program
{
    static async Task Execute(params Func<Task>[] actions)
    {
        var tasks = actions.Select( action => action() );
        await Task.WhenAll(tasks);
    }

    public static async Task MainAsync()
    {
        await Execute
        (
            async () => 
            {
                await Task.Delay(3000);
                Console.WriteLine("Function 1 done");
            }
            ,
            async () =>
            {
                await Task.Delay(3000);
                Console.WriteLine("Function 2 done");
            }
        );
    }

    public static void Main()
    {
        MainAsync().GetAwaiter().GetResult();
    }
}

输出:

Function 2 done
Function 1 done

Example code on DotNetFiddle