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();
}
}
}
我有一种情况,如果任何方法返回false,我想要回滚方法完成的工作。我没有在我的代码中执行任何与数据库相关的活动,所以有没有办法在C#4.0或更高版本中回滚/撤消更改。 我试图使用TransactionScope,但它没有做回滚。 其他方式我想到实现我自己的回滚方法,它将手动撤消所有更改(如果文件被复制,我将检查目标文件并使用代码删除它)。那么还有其他解决方法吗?
到目前为止我已尝试过这个。
var arr = [];
$("div span.topic").each(function(){
arr.push($(this).text());
});
console.log(arr);
答案 0 :(得分:2)
我认为你自己更好地命令模式。 您的交易'如果可以这么说,basicaly是命令列表。这些命令只能一次执行。实施起来并不复杂。
以下是我在需要此行为时使用的内容:
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; }
});