public virtual async Task <ISnapshot> CreateSnapshotAsync(ISnapshot snapshot) { Argument.IsNotNull(() => snapshot); Log.Info($"Creating snapshot '{snapshot}'"); await SnapshotCreatingAsync.SafeInvokeAsync(this, new SnapshotEventArgs(snapshot)); var providers = GetProviders(); foreach (var provider in providers) { await provider.CreatingSnapshotAsync(snapshot); } foreach (var provider in providers) { Log.Debug($"Creating data for snapshot '{snapshot}' using provider '{provider}'"); var names = provider.GetNames(); foreach (var name in names) { Log.Debug($"Creating data for snapshot '{snapshot}' using provider '{provider}::{name}'"); byte[] providerData; using (var memoryStream = new MemoryStream()) { await provider.StoreDataToSnapshotAsync(name, memoryStream); providerData = memoryStream.ToArray(); } snapshot.SetData(name, providerData); } } foreach (var provider in providers) { await provider.CreatedSnapshotAsync(snapshot); } SnapshotCreated.SafeInvoke(this, () => new SnapshotEventArgs(snapshot)); Log.Info($"Created snapshot '{snapshot}'"); return(snapshot); }