如何回滚C#中完成的工作?

时间:2016-10-21 13:10:57

标签: c# transactions

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);

1 个答案:

答案 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; }
                   });