110,535
社区成员
发帖
与我相关
我的任务
分享
await Task.WhenAll(rollback.......)
部分代码。所以就针对不同类型的业务,设计不同的 Action,调用日志内容来进行回滚。using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
List<Task> work = new List<Task>();
work.Add(Task.Run(() => Console.WriteLine("第一件事儿")));
work.Add(Task.Run(() => Console.WriteLine("第二件事儿")));
work.Add(Task.Run(() => Console.WriteLine("第三件事儿")));
work.Add(Task.Run(async () =>
{
await Task.Delay(1000);
Console.WriteLine("第四件事儿");
//throw new Exception("失败!");
}));
List<Action> rollback = new List<Action>();
rollback.Add(() => Console.WriteLine("回滚第一件事儿"));
rollback.Add(() => Console.WriteLine("回滚第二件事儿"));
rollback.Add(() => Console.WriteLine("回滚第三件事儿"));
rollback.Add(() => Console.WriteLine("回滚第四件事儿"));
test(work, rollback);
Console.WriteLine(".....................按任意键结束");
Console.ReadKey();
}
private static async void test(List<Task> work, List<Action> rollback)
{
try
{
await Task.WhenAll(work);
}
catch (Exception)
{
await Task.WhenAll(rollback.Select(proc => Task.Run(proc)));
throw;
}
}
}
}
这里可以看到,方法 test 它异步并发执行了“第一件事儿,第二件事儿,第三件事儿,第四件事儿”;一旦遇到失败情况,则会异步并发执行是先注册的四个 Action 委托,然后再抛出之前发现的异常。