определение момента завершения резервного копирования db4o - PullRequest
0 голосов
/ 09 сентября 2010

Как я могу узнать, когда db4o начался с кода , закончился?

Док упоминает, что он выполняет резервное копирование в отдельном потоке, но ничего не упоминает о том, когда он заканчивается. Метод не получает никакого обратного вызова.

1 Ответ

3 голосов
/ 09 сентября 2010

Насколько я знаю, это невозможно = (. Когда вы пытаетесь выполнить резервное копирование, когда оно уже готово, вы получаете BackupInProgressException. Таким образом, вы знаете, что резервное копирование уже выполняется.

Однако это не является настоящим уведомлением и не является полезным во многих ситуациях.

Однако существует сложный обходной путь. Вы можете предоставить собственную реализацию хранилища для процесса резервного копирования:

IStorage myStorage = ...; container.Ext (). Backup (myStorage, "backup.db4o.bak");

Таким образом, вы можете реализовать обертку-хранилище, которая уведомляет вас.Декоратор, который реализует интерфейс IStorage. Возвращаемые экземпляры IBin затем уведомляют вас о закрытии. Когда резервная копия вызывает метод закрытия для экземпляра IBin, вы знаете, что это сделано.

Вотчерновик того, как это делается (не тест или что-то в этом роде). StorageDecorator - это базовый класс для декораторов IStorage, который включен в db4o.

class NotificationStorageDecorator : StorageDecorator
{
    public NotificationStorageDecorator(IStorage storage) : base(storage)
    {

    }

    public NotificationStorageDecorator() : this(new FileStorage()){}

    protected override IBin Decorate(BinConfiguration config, IBin bin)
    {
        return new MyNotificationBin(bin);    
    }

    class MyNotificationBin : BinDecorator
    {
        public MyNotificationBin(IBin bin) : base(bin)
        {
        }

        public override void Close()
        {
            base.Close();
            // Implement here your notification-mechanism
            // For example with events etc
            Console.Out.WriteLine("Backup-done");
        }
    }
}

// затем используйте его

            var notifactionStorage = new NotificationStorageDecorator();
            container.Ext().Backup(notifactionStorage,"backup.db4o.back");
...