Как синхронизировать коллекцию в C #? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть простая размещенная служба (называемая TransactionService) в приложении .net core web api.У меня проблемы с заполнением списка в TransactionService

В моем TransactionController я использую следующий метод для добавления транзакции:

public IActionResult CreateTransaction(Transaction transaction)
{
    // validate
    var _transactionS= (TransactionService)_transactionService.Service;
    _transactionS.Add(transaction);
    return Ok();    
}

И в моем TransactionService class:

private List<Transaction> transactions = new List<Transaction>();

public void AddTransaction(Transaction transaction)
{
    transactions.Add(transaction);
}

protected override Task FilterTransactions()
{
    foreach(var item in transactions)
    {
       //Do some work
    }
       return Task.CompletedTask;
    }
}

Поэтому, когда я вызываю CreateTransaction в моем контроллере, это вызывает метод AddTransaction в моем классе обслуживания.

Метод FilterTransaction выполняется каждый раз5 секунд, просмотрите каждый элемент моего списка и проверьте некоторые условия, единственная проблема в том, что мой список транзакций пуст.

Если я добавлю точку останова в моем AddTransactionMethod, он покажет мне правильный счет, ноточка останова в моем операторе foreach будет показывать счетчик 0.

Это код класса Startup для регистрации службы

services.AddHostedService<TransactionService>();
services.AddSingleton<IHostedServiceAccessor<ITransactionService>, HostedServiceAccessor<ITransactionService>>();

И настройки TransactionService:

public interface IHostedServiceAccessor<out T> where T : IHostedService
{
    T Service { get; }
}
public class HostedServiceAccessor<T> : IHostedServiceAccessor<T> where T : IHostedService
{
    public HostedServiceAccessor(IEnumerable<IHostedService> hostedServices)
    {
        Service = hostedServices.OfType<T>().FirstOrDefault();
    }

    public T Service { get; }
}


public interface ITransactionService: IHostedService
{
}

internal class TransactionService : TransactionServiceBase, ITransactionService
{

    private List<Transaction> transactions = new List<Transaction>();

    public TransactionService()
    :base(TimeSpan.FromMilliseconds(5000))
    {
    }

public void AddTransaction(Transaction transaction)
{
    transactions.Add(transaction);
}

protected override Task FilterTransactions()
{
    foreach (var item in transactions)
    {
        //Do some work
    }
    return Task.CompletedTask;
}

}

Класс TransactionServiceBase наследует форму BackgroundService и является DLL.Он имеет абстрактный метод FilterTransaction и еще один запечатанный ExecuteAsync ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...