Das Problem tritt auf, wenn ein anderer Prozess gestartet wird, der für die Durchführung von Sicherungen auf Google Drive (unter Verwendung der Google API) verantwortlich ist. Das Backup wird einmal täglich ausgeführt. Wenn Prozesse gleichzeitig stattfinden, friert die Aktualisierungsmethode während der Verarbeitung einiger Aufgaben ein, stoppt den Fortschritt vollständig und wiederholt sich nicht.
Code: Select all
private async Task UpdateCTOs_OLD()
{
List CTOsToSendAlert = new List();
SmartOLT_get_onu_status API = new SmartOLT_get_onu_status();
using (var semaphore = new SemaphoreSlim(4))
{
var tasks = ListCTOs.Select(async CTO =>
{
await semaphore.WaitAsync();
try
{
using (var dbContext = new BaseDbContext())
{
CtoD_CTOs? CTO_DB = await dbContext.CtoD_CTOs.Where(o => o.Nome == CTO.Nome).FirstOrDefaultAsync();
if (CTO_DB is null)
{
await SendToHistorico("", CTO.Nome, "Created", 0, dbContext);
await dbContext.CtoD_CTOs.AddAsync(CTO);
Console.WriteLine($" {CTO.Nome} Created!\n");
}
else
{
if (CTO_DB.ClientesNumero != CTO.ClientesNumero || CTO_DB.Online != CTO.Online)
{
bool Online_Status_API = true;
if (CTO_DB.Online != CTO.Online && CTO.Online) { await SendToHistorico("", CTO.Nome, "Online", 0, dbContext); }
else if (CTO_DB.Online != CTO.Online && !CTO.Online) { await SendToHistorico("", CTO.Nome, "Offline", 0, dbContext); }
if (!CTO.Online && CTO_DB.Online)
{
CtoD_CTOs? ValidatedCTO = await ValidateCtoAlert(CTO, API);
if (ValidatedCTO is not null) { CTOsToSendAlert.Add(ValidatedCTO); Online_Status_API = false; }
}
CTO_DB.ClientesNumero = CTO.ClientesNumero;
CTO_DB.Online = Online_Status_API;
CTO_DB.Long = CTO.Long;
CTO_DB.Lat = CTO.Lat;
Console.WriteLine($"{CTO.Nome} updated!\n");
}
}
await dbContext.SaveChangesAsync();
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao salvar {CTO.Nome}: {ex.Message}");
}
semaphore.Release();
});
Console.WriteLine("Waiting for tasks to complete...");
await Task.WhenAll(tasks);
Console.WriteLine("All tasks completed!");
API.Dispose();
}
using (var dbContext = new BaseDbContext())
{
List CTOsToDelete = await dbContext.CtoD_CTOs
.Where(o => !ListCTOs.Contains(o))
.ToListAsync();
Console.WriteLine($"CTOs to delete: {CTOsToDelete.Count}");
foreach (var Cto in CTOsToDelete)
{
await SendToHistorico("", Cto.Nome, "Deleted", 0, dbContext);
dbContext.CtoD_CTOs.Remove(Cto);
Console.WriteLine($" CTO {Cto.Nome} Deleted!\n");
}
await dbContext.SaveChangesAsync();
Console.WriteLine("CTOs Deleted!");
CTOsToSendAlert = CTOsToSendAlert.Where(n => n.ClientesNumero > 1).ToList();
if (CTOsToSendAlert.Sum(o => o.ClientesNumero) > Data.CtoClientLimtToAlert)
{
await SendEmails(CTOsToSendAlert);
await SendTelegramMessages(CTOsToSendAlert);
}
}
}
Ich habe versucht, beide gleichzeitig auszuführen, aber der Fehler trat auf nicht auftreten und zusätzliche Protokolle hinzugefügt, um den Aufgabenfortschritt zu überwachen.