private Task ProcessPendingErrorsAsync()

in SDK/AppCenterCrashes/Microsoft.AppCenter.Crashes.Windows.Shared/Crashes.cs [229:287]


        private Task ProcessPendingErrorsAsync()
        {
            return Task.Run(async () =>
            {
                ErrorReport lastSessionErrorReport = null;
                foreach (var file in ErrorLogHelper.GetErrorLogFiles())
                {
                    AppCenterLog.Debug(LogTag, $"Process pending error file {file.Name}");
                    var log = ErrorLogHelper.ReadErrorLogFile(file);

                    // Delete file if corrupted.
                    if (log == null)
                    {
                        AppCenterLog.Error(LogTag, $"Error parsing error log. Deleting invalid file: {file.Name}");
                        try
                        {
                            file.Delete();
                        }
                        catch (System.Exception ex)
                        {
                            AppCenterLog.Warn(LogTag, $"Failed to delete error log file {file.Name}.", ex);
                        }

                        // Also try to delete paired exception file.
                        if (Guid.TryParse(System.IO.Path.GetFileNameWithoutExtension(file.Name), out var id))
                        {
                            ErrorLogHelper.RemoveStoredExceptionFile(id);
                        }
                        continue;
                    }

                    // The error report cannot be built if any of those fields are null.
                    if (log.Device == null || log.AppLaunchTimestamp == null || log.Timestamp == null)
                    {
                        AppCenterLog.Error(LogTag, $"Error parsing error log. Deleting invalid file: {file.Name}");
                        RemoveAllStoredErrorLogFiles(log.Id);
                        continue;
                    }

                    // Build and record error report.
                    var report = BuildErrorReport(log);
                    if (lastSessionErrorReport == null || lastSessionErrorReport.AppErrorTime < report.AppErrorTime)
                    {
                        lastSessionErrorReport = report;
                    }
                    if (ShouldProcessErrorReport?.Invoke(report) ?? true)
                    {
                        _unprocessedManagedErrorLogs.Add(log.Id, log);
                    }
                    else
                    {
                        AppCenterLog.Debug(LogTag, $"ShouldProcessErrorReport returned false, clean up and ignore log: {log.Id}");
                        RemoveAllStoredErrorLogFiles(log.Id);
                    }
                }
                _lastSessionErrorReportTaskSource.SetResult(lastSessionErrorReport);
                await SendCrashReportsOrAwaitUserConfirmationAsync().ConfigureAwait(false);
            });
        }