我正在编写一个包装函数,该函数执行任意数量的异步任务,并将提供重试和错误处理策略。我在等待异步任务结果时遇到问题。
方法调用如下:
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);
//...
}
是否可以用异步方法实现我想要的?
答案 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