Asynchrone Aufgaben frieren während der Ausführung ein, wenn eine Datenbanksicherung in C# beginntC#

Ein Treffpunkt für C#-Programmierer
Guest
 Asynchrone Aufgaben frieren während der Ausführung ein, wenn eine Datenbanksicherung in C# beginnt

Post by Guest »

Ich stoße auf ein Problem mit einer Methode, die eine Liste von Objekten in der Datenbank aktualisiert. Die Methode ist asynchron, wird alle 3 Minuten ausgeführt und verwendet async/await mit einem SemaphoreSlim, um die Anzahl gleichzeitiger Aufgaben zu begrenzen. Darüber hinaus interagiert die Methode während ihrer Ausführung mit einer externen API.
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);
}
}
}
Was könnte dazu führen, dass diese Methode während der Ausführung beim Start der Sicherung einfriert?
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post