Асинхронные задачи зависают во время выполнения, когда начинается резервное копирование базы данных на C#C#

Место общения программистов C#
Ответить
Anonymous
 Асинхронные задачи зависают во время выполнения, когда начинается резервное копирование базы данных на C#

Сообщение Anonymous »

Я столкнулся с проблемой с методом, который обновляет список объектов в базе данных. Этот метод является асинхронным, запускается каждые 3 минуты и использует async/await с SemaphoreSlim для ограничения количества одновременных задач. Кроме того, во время своего выполнения метод взаимодействует с внешним API.
Проблема возникает при запуске другого процесса, отвечающего за выполнение резервного копирования на 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»