首页 > 解决方案 > 如何在 C# 中同步集合?

问题描述

TransactionService在 .net 核心 web api 应用程序中有一个简单的托管服务(称为)。我在填充列表时遇到问题TransactionService

在我的TransactionController我使用以下方法来添加交易:

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

在我的TransactionService课堂上:

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()

标签: c#asp.net-corecollectionstasksynchronized

解决方案


推荐阅读