如何回滚c#中完成的工作
本文关键字:工作 何回滚 | 更新日期: 2023-09-27 18:14:07
static void Main(string[] args)
{
bool bMethod1 = Metthod1();
bool bMethod2 = Metthod2();
bool bMethod3 = Metthod3();
if (!bMethod1 || !bMethod2 || !bMethod3)
{
//RollBack
}
}
我有一种情况,如果任何方法返回false,我想回滚方法所做的工作。我没有在我的代码中做任何与数据库相关的活动,所以有任何方法可以回滚/撤消c# 4.0或以上的更改。我试图使用TransactionScope,但它不做回滚。我还想到了实现自己的回滚方法,该方法将手动撤消所有更改(例如,如果文件被复制,我将检查目标文件并使用代码删除它)。那么还有其他解决方法吗?
我已经试过了。
static void Main(string[] args)
{
using (TransactionScope scope = new TransactionScope())
{
bool bMethod1 = Metthod1();
bool bMethod2 = Metthod2();
bool bMethod3 = Metthod3();
if (!bMethod1 || !bMethod2 || !bMethod3)
{
//RollBack
Transaction.Current.Rollback();
}
if (Transaction.Current.TransactionInformation.Status == TransactionStatus.Committed)
{
scope.Complete();
}
}
}
我认为你最好自己实现命令模式。你的"事务",如果你可以这么说的话,基本上就是一个命令列表。这些命令只能同时执行。实现起来并不复杂。
下面是我在需要这种行为时使用的代码:
public struct Command
{
public Action Upgrade;
public Action Downgrade;
}
public static void InvokeSafe(params Command[] commands)
{
var completed = new Stack<Command>();
try
{
foreach (var cmd in commands)
{
cmd.Upgrade();
completed.Push(cmd);
}
}
catch (Exception up)
{
try
{
foreach (var cmd in completed)
{
cmd.Downgrade();
}
}
catch (Exception down)
{
throw new AggregateException(up, down);
}
throw;
}
}
然后像这样调用它:
int value = 3;
int modifier = 4;
InvokeSafe(new Command
{
Upgrade = () => { value += modifier; },
Downgrade = () => { value -= modifier; }
},
new Command
{
Upgrade = () => { value *= modifier; },
Downgrade = () => { value /= modifier; }
});