Интуитивно понятная и простая реализация BackgroundService, активируемая по событию.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Интуитивно понятная и простая реализация BackgroundService, активируемая по событию.

Сообщение Anonymous »

Я использую C# .NET 8, чтобы попытаться реализовать простой и интуитивно понятный BackgroundService, который запускается через событие, а не по таймеру, и который ограничивает работу одним потоком. Я собрал несколько источников и пришел к такому результату, но я не уверен, что смогу ввести зависимость от внешнего пакета для чего-то, что должно быть тривиальным. Я предполагаю, что есть решение, которое использует встроенные компоненты вместо создания зависимости от сторонних пакетов? Может ли кто-нибудь предложить такое решение?

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

using System.Reactive.Linq;
using System.Reactive.Subjects;

// di singleton
public class Observables {
public readonly Subject Subject = new Subject();

public IObservable Observable;

public Observables()
{
Observable = Subject.AsObservable();
}
}

public class ObservableBackgroundServiceManual : BackgroundService {
private readonly ILogger _logger;
private readonly Observables _observables;
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(0, 1);

public ObservableBackgroundServiceManual(ILogger logger, Observables observables)
{
_logger = logger;
_observables = observables;
}

protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_observables.Observable
.Select(value => Observable.FromAsync(async () => await DoBackgroundWork(value)))
.Concat()
.Subscribe(
token: stoppingToken
);

return Task.CompletedTask;
}

private void DoBackgroundWork(int value)
{
// Implement the background work to be done when the observable emits a value
_logger.LogInformation($"Doing background work with value: {value}");
}

public override async Task StopAsync(CancellationToken cancellationToken)
{
await base.StopAsync(cancellationToken);
}
}

// Example usage
public class MyObservableService {
private readonly Observables _observables;

public MyObservableService(Observables observables)
{
_observables = observables;
}

public void TriggerChange(int newValue)
{
_observables.Subject.OnNext(newValue);
}
}
Изменить:
Изменить формулировку вопроса, чтобы он был более основан на фактах

Подробнее здесь: https://stackoverflow.com/questions/788 ... n-an-event
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как очистить/очистить объект AsyncLocal в BackgroundService(Microsoft.Hosting.Extensions.BackgroundService)?
    Anonymous » » в форуме C#
    0 Ответы
    80 Просмотры
    Последнее сообщение Anonymous
  • Интуитивно понятно, почему попарное суммирование дает меньшую ошибку, чем наивное суммирование.
    Anonymous » » в форуме Python
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Объясните интуитивно эту индексацию массива 4D numpy
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Любая простая реализация VAD?
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Внедрить репозиторий в ядро ​​BackgroundService asp.net
    Anonymous » » в форуме C#
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous

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