Проблема возникает при запуске другого процесса, отвечающего за выполнение резервного копирования на Google Диск (с использованием Google API). Резервное копирование выполняется один раз в день. Когда процессы происходят одновременно, метод обновления зависает во время обработки некоторых задач, полностью перестает выполняться и не повторяется.
Код: Выделить всё
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);
}
}
}
Я пытался выполнить оба одновременно, но возникла ошибка не происходит, и добавлены дополнительные журналы для отслеживания хода выполнения задачи.
Подробнее здесь: https://stackoverflow.com/questions/793 ... in-c-sharp
Мобильная версия