public virtual async Task RestoreSnapshotAsync(ISnapshot snapshot) { Argument.IsNotNull(() => snapshot); Log.Info($"Restoring snapshot '{snapshot}'"); await SnapshotRestoringAsync.SafeInvokeAsync(this, new SnapshotEventArgs(snapshot)); var providers = GetProviders(); foreach (var provider in providers) { await provider.RestoringSnapshotAsync(snapshot); } foreach (var provider in providers) { Log.Debug($"Restoring data for snapshot '{snapshot}' using provider '{provider}'"); var names = provider.GetNames(); foreach (var name in names) { Log.Debug($"Restoring data for snapshot '{snapshot}' using provider '{provider}::{name}'"); var providerData = snapshot.GetData(name); if (providerData == null) { providerData = new byte[] {}; } using (var memoryStream = new MemoryStream(providerData)) { await provider.RestoreDataFromSnapshotAsync(name, memoryStream); } } } foreach (var provider in providers) { await provider.RestoredSnapshotAsync(snapshot); } SnapshotRestored.SafeInvoke(this, () => new SnapshotEventArgs(snapshot)); Log.Info($"Restored snapshot '{snapshot}'"); }