Проблема с асинхронным методом С# с «огонь и забудь»C#

Место общения программистов C#
Ответить
Anonymous
 Проблема с асинхронным методом С# с «огонь и забудь»

Сообщение Anonymous »

Асинхронный метод Like должен запускать и забывать действие, подобное пользователю. Но с тех пор мне интересно, как лучше всего справиться с асинхронным пожаром и забыть.
Вариант 1:

Код: Выделить всё

public async Task Like(LikeDto dto)
{
var _ = svc.ExecuteDb(async (context) =>
{
var (rating, liked) = await likeAndSave(context, dto.Liked);
await sendEvents(dto.Id, liked);
});

await Task.CompletedTask;
}
Вариант 2:

Код: Выделить всё

public async Task Like(LikeDto dto)
{
var _ = svc.ExecuteDb(async (context) =>
{
var (rating, liked) = await likeAndSave(context, dto.Liked);
await sendEvents(dto.Id, liked);
});

await Task.FromResult(_);
}
Вариант 3:

Код: Выделить всё

public async Task Like(LikeDto dto)
{
await Task.Run(() =>
{
var _ = svc.ExecuteDb(async (context) =>
{
var (rating, liked) = await likeAndSave(context, dto.Liked);
await sendEvents(dto.Id, liked);
});
});
}
Класс svc для помощи в ситуациях, когда задача не ожидает выполнения, а также контекст http-req для времени жизни внедренных служб будут недоступны.

Код: Выделить всё

public class SercicesProvider where T : DbContext
{
private readonly IServiceProvider _services;

public SercicesProvider(IServiceProvider svc)
{
_services = svc;
}

public async Task ExecuteDb(Func action)
{
using (var scope = _services.CreateScope())
{
var service = scope.ServiceProvider.GetRequiredService();
await action(service);
}
}
}
Все подходы работают, но ждут Task.CompletedTask; кажется, с этим лучше всего справиться.

Подробнее здесь: https://stackoverflow.com/questions/791 ... and-forget
Ответить

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

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

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

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

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