暗示;取消“;功能模式C#

暗示;取消“;功能模式C#,c#,.net,design-patterns,backup,C#,.net,Design Patterns,Backup,我写了一个c#程序来执行系统备份 备份过程基本上从数据库读取数据,并在文件系统中创建备份 备份过程大约需要45-75秒才能完成, 我的产品经理要求我实现取消功能 以下是我所做的: 如果应用了cancel,我会在数据库中保留一条“cancel requested”记录 在整个备份过程(包括几个步骤)中,我调用一个方法ThrowIfCancelRequested(),如果是,则回滚该过程 现在的问题是它让我的代码很难看,现在我到处都是ThrowIfCancelRequested(),我的意思是它完成

我写了一个c#程序来执行系统备份

备份过程基本上从数据库读取数据,并在文件系统中创建备份

备份过程大约需要45-75秒才能完成, 我的产品经理要求我实现取消功能

以下是我所做的:

  • 如果应用了cancel,我会在数据库中保留一条“cancel requested”记录

  • 在整个备份过程(包括几个步骤)中,我调用一个方法ThrowIfCancelRequested(),如果是,则回滚该过程

  • 现在的问题是它让我的代码很难看,现在我到处都是ThrowIfCancelRequested(),我的意思是它完成了任务,但它很难看

    我还考虑重新设计备份过程结构,以便在主备份过程中插入包含取消操作的备份步骤

    例如

    接口IBackupStep
    {
    void Execute();
    void OnCancel();
    }
    空干管(IEnumerable steps)
    {
    foreach(var步进)
    {
    执行()步骤
    }
    }
    
    这里的问题是,这对我来说几乎是不可能的,备份过程最初不是由我编写的,重构它的god objects代码非常困难


    所以我的问题是,也许我缺少的另一个替代方案也能使我的代码更好地工作并设计?

    foreach循环不是必需的,因为参数中只有一个步骤。我只是想一想。哦,得了吧,你知道这是一个打字错误,我会纠正它:)你可以听一个事件,以避免浏览数据库,但这不会消除不时检查的重复。。一种可能是在不同的线程中启动备份,然后取消该线程,但问题中没有足够的信息来确定这是否是一件好事:)foreach循环不是必需的,因为参数中只有一个步骤。我只是想一想。哦,得了吧,你知道这是一个打字错误,我会纠正它:)你可以听一个事件,以避免浏览数据库,但这不会消除不时检查的重复。。一种可能是在另一个线程中启动备份,然后取消该线程,但问题中没有足够的信息来确定这是否是一件好事:)
    interface IBackupStep
    {
        void Execute();
    
        void OnCancel();
    }
    
    void main(IEnumerable<IBackupStep> steps)
    {
        foreach (var step in steps)
        {
            step.Execute()
        }
    }