Tengo que agregar algún trabajo adicional a un método SaveChanges
contexto de base de datos. Necesito que este trabajo se realice después del método base.SaveChanges (), porque necesito los Id. De registros después de que se agregaron a la base de datos. El esquema de mis métodos de SaveChanges es el siguiente (se necesitan dos bloques try..catch
para aislar los cambios guardados en la base de datos de otras operaciones):
public override int SaveChanges()
{
using (var scope = new TransactionScope())
{
var result = 0;
try
{
result = base.SaveChanges();
}
catch (Exception ex)
{
//Log context exception
throw;
}
try
{
//do some extra work
var extraWorkRes = DoExtraWork();
}
catch (Exception ex)
{
//Log exception
throw;
}
scope.Complete();
return result;
}
}
Mi problema es el método SaveChangesAsync
, porque no tengo mucha experiencia con las tareas .NET y no sé si lo estoy anulando correctamente.
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
using (var scope = new TransactionScope())
{
var result = 0;
try
{
result = await base.SaveChangesAsync(cancellationToken);
}
catch (Exception ex)
{
//log context exception
throw;
}
try
{
//do some extra work
var extraWorkRes = await DoExtraWorkAsync(cancellationToken);
}
catch (Exception ex)
{
//Log exception
throw;
}
scope.Complete();
return result;
}
}
private Task<int> DoExtraWorkAsync(CancellationToken cancellationToken)
{
return Task.Run<int>(() => this.DoExtraWork(cancellationToken));
}
Necesito ayuda, algunos consejos sobre cómo anular correctamente SaveChangesAsync
.
Gracias de antemano por tu ayuda.
Ajustar un método síncrono en un Task.Run y llamarlo TheOriginalMethodAsync es un olor de código común.
¿DoExtraWork () es una operación vinculada a la CPU que le gustaría liberar el subproceso actual mientras está sucediendo? Si es así, refactorizarlo para estar en línea:
var extraWorkRes = await Task.Run<int>(() => this.DoExtraWork());
Si no, simplemente llámalo directamente:
var extraWorkRes = this.DoExtraWork();
¿Necesita el resultado de DoExtraWork fuera de SaveChanges? Si no, no necesitas asignarlo.
En caso de que este sea su código real, también tenga en cuenta que se perdió un corchete de cierre de Task.Run. Todo lo demás me parece bien. ¿Tiene algún problema cuando lo ejecuta o simplemente está comprobando por el bien de la cordura?