Проблема в том, что если я решу этот способ :
Код: Выделить всё
public async Task Like(LikeDto dto)
{
async Task likeAndSave(Rating rating, bool isLiked)
{
bool like() => rating.Like(_auth.User, rating.OfferId, isLiked);
var liked = false;
try
{
liked = like();
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
_context.Entry(rating).Reload();
liked = like();
await _context.SaveChangesAsync();
//Concurrency conflic my occur again here.
}
return liked;
}
var rating = await _context.Set()
.Include(e => e.Likes.Where(e => e.User.Id == _auth.UserId))
.FirstOrDefaultAsync(e => e.OfferId == dto.Id);
var liked = await likeAndSave(rating, dto.Liked);
return rating.Analytics;
}
Код: Выделить всё
public async Task Like(LikeDto dto)
{
async Task likeAndSave(bool isLiked, int maxRetryAttempts = 50)
{
TimeSpan pauseBetweenFailures = TimeSpan.FromSeconds(2);
var liked = false;
Rating rating = null;
AsyncRetryPolicy policy = Policy
.Handle()
.WaitAndRetryAsync(maxRetryAttempts, retryAttempt =>
TimeSpan.FromMilliseconds(pauseBetweenFailures.TotalMilliseconds * Math.Pow(2, retryAttempt - 1)));
await policy.ExecuteAsync(async () =>
{
rating = await _context.Set()
.Include(e => e.Likes.Where(e => e.User.Id == _auth.UserId))
.FirstOrDefaultAsync(e => e.OfferId == dto.Id);
liked = rating.Like(_auth.User, rating.OfferId, isLiked);
await _context.SaveChangesAsync();
});
return (rating, liked);
}
var (rating, liked) = await likeAndSave(dto.Liked);
return rating.Analytics;
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... post-likes
Мобильная версия