/// <inheritdoc/> public Task <int> TryFlushAsync <TLog>(Predicate <TLog> predicate, LogUploaderWithToken <TLog> uploader, CancellationToken token, FlushMode mode) where TLog : LogBase { if (typeof(TLog) == typeof(ExceptionReport)) { return(TryFlushAsync <TLog, RealmExceptionReport>(predicate, uploader, token, mode)); } if (typeof(TLog) == typeof(Event)) { return(TryFlushAsync <TLog, RealmEvent>(predicate, uploader, token, mode)); } throw new ArgumentException("The input type is not valid", nameof(TLog)); }
[SuppressMessage("ReSharper", "MethodSupportsCancellation")] // Local db query private async Task <int> TryFlushAsync <TLog, TRealm>([CanBeNull] Predicate <TLog> predicate, [NotNull] LogUploaderWithToken <TLog> uploader, CancellationToken token, FlushMode mode) where TLog : LogBase where TRealm : RealmObject, ILog { var query = await Task.Run(() => { if (predicate == null) { return(LoadAsync <TLog>()); } return(( from pair in LoadAsync <TLog>() where predicate(pair.Log) select pair).ToArray()); }); int flushed = 0; switch (mode) { // Sequentially upload and remove the logs, stop as soon as one fails case FlushMode.Serial: foreach (var pair in query) { if (token.IsCancellationRequested || !await uploader(pair.Log, token)) { break; } RemoveUid <TRealm>(pair.Uid); flushed++; } return(flushed); // Upload the logs in parallel, then remove the ones uploaded correctly case FlushMode.Parallel: bool[] results = await Task.WhenAll(query.Select(pair => uploader(pair.Log, token))); for (int i = 0; i < results.Length; i++) { if (results[i]) { RemoveUid <TRealm>(query[i].Uid); flushed++; } } return(flushed); default: throw new ArgumentException("The input flush mode is not valid", nameof(mode)); } }
public Task <int> TryFlushAsync <TLog>(LogUploaderWithToken <TLog> uploader, CancellationToken token, FlushMode mode) where TLog : LogBase => TryFlushAsync(null, uploader, token, mode);
/// <inheritdoc/> public Task <int> TryFlushAsync <TLog>(Predicate <TLog> predicate, LogUploaderWithToken <TLog> uploader, CancellationToken token) where TLog : LogBase => TryFlushAsync(predicate, uploader, token, FlushMode.Serial);