如何回滚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();
            }
        }
    }

如何回滚c#中完成的工作

我认为你最好自己实现命令模式。你的"事务",如果你可以这么说的话,基本上就是一个命令列表。这些命令只能同时执行。实现起来并不复杂。

下面是我在需要这种行为时使用的代码:

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