示例#1
0
 /// <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));
 }
示例#2
0
        [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));
            }
        }
示例#3
0
 public Task <int> TryFlushAsync <TLog>(LogUploaderWithToken <TLog> uploader, CancellationToken token, FlushMode mode) where TLog : LogBase
 => TryFlushAsync(null, uploader, token, mode);
示例#4
0
 /// <inheritdoc/>
 public Task <int> TryFlushAsync <TLog>(Predicate <TLog> predicate, LogUploaderWithToken <TLog> uploader, CancellationToken token) where TLog : LogBase
 => TryFlushAsync(predicate, uploader, token, FlushMode.Serial);