C# 查询参数是持久值

C# 查询参数是持久值,c#,asp.net-core,C#,Asp.net Core,我必须模拟来自服务器的实时数据流,为此我从System.Threading命名空间实现了一个计时器类 public class DataManager { private Timer _timer; private AutoResetEvent _autoResetEvent; private Action _action; public DateTime TimerStarted { get; } public DataManager(Action

我必须模拟来自服务器的实时数据流,为此我从System.Threading命名空间实现了一个计时器类

public class DataManager
{
    private Timer _timer;
    private AutoResetEvent _autoResetEvent;
    private Action _action;

    public DateTime TimerStarted { get; }

    public DataManager(Action action)
    {
        _action = action;
        _autoResetEvent = new AutoResetEvent(false);
        _timer = new Timer(Execute, _autoResetEvent, 0, 10000);
        TimerStarted = DateTime.Now;
    }

    public void Execute(object stateInfo)
    {
        _action();
        if ((DateTime.Now - TimerStarted).Seconds > 60)
        {
            _timer.Dispose();
        }
    }
}
并使用该类执行repository方法以从控制器获取最新数据

[HttpGet]
public async Task<IActionResult> Get([FromQuery] PagedTransactionDataRequest queryParams)
{
    var pageSize = queryParams.PageSize ?? 1;
    var pageNumber = queryParams.PageNumber ?? 10;

    <b>var timerManager = new DataManager(async () =>
    await _paymentDraftHub.Clients.All.SendAsync(SignalRConstants.TransferPaymentDraftServiceData, await _paymentTransactionRepository.GetAllDeclinedAsync(pageSize, pageNumber))
    );</b>

    var response = new ResponseMessage { Message = "Accepted", Code = "201" };
    return Ok(response);
}
[HttpGet]
公共异步任务Get([FromQuery]PagedTransactionDataRequestQueryParams)
{
var pageSize=queryParams.pageSize±1;
变量pageNumber=queryParams.pageNumber±10;
var timermager=newdatamanager(异步()=>
await_paymentDraftHub.Clients.All.SendAsync(SignalConstants.TransferPaymentDraftServiceData,await_paymentTransactionRepository.GetAllDeclinedAsync(页面大小,页面编号))
);
var response=newresponsemessage{Message=“Accepted”,Code=“201”};
返回Ok(响应);
}
问题:对API的第一个请求工作正常,但在第二个请求期间,
pageSize
pageNumber
也有旧值。当计时器每10秒运行一次时,我可以看到旧的查询参数值和新的查询参数值都被执行


我不知道为什么要执行旧值。

当您调用第一个GET时,您创建了一个DataManager。该数据管理器只知道第一个查询参数。然后,它使用这些参数在计时器上执行

当您调用第二个GET时,您正在创建第二个DataManager。第二个管理器也将开始使用第二组参数在计时器上执行,但它根本不会影响第一组参数

一种解决方案是使DataManager成为控制器的成员,并将所需操作作为属性公开:

private DataManager _manager;

    [HttpGet]
    public async Task<IActionResult> Get([FromQuery] PagedTransactionDataRequest queryParams)
    {
        var pageSize = queryParams.PageSize ?? 1;
        var pageNumber = queryParams.PageNumber ?? 10;

if(_manager == null) {_manager = new DataManager(async () =>
        await _paymentDraftHub.Clients.All.SendAsync(SignalRConstants.TransferPaymentDraftServiceData, await _paymentTransactionRepository.GetAllDeclinedAsync(pageSize, pageNumber))
        );
}
else
{_manager.action = async () => await _paymentDraftHub.Clients.All.SendAsync(SignalRConstants.TransferPaymentDraftServiceData, await _paymentTransactionRepository.GetAllDeclinedAsync(pageSize, pageNumber));
}

        var response = new ResponseMessage { Message = "Accepted", Code = "201" };
        return Ok(response);
    }
专用数据管理器\u管理器;
[HttpGet]
公共异步任务Get([FromQuery]PagedTransactionDataRequestQueryParams)
{
var pageSize=queryParams.pageSize±1;
变量pageNumber=queryParams.pageNumber±10;
如果(\u manager==null){\u manager=newdatamanager(异步()=>
await_paymentDraftHub.Clients.All.SendAsync(SignalConstants.TransferPaymentDraftServiceData,await_paymentTransactionRepository.GetAllDeclinedAsync(页面大小,页面编号))
);
}
其他的
{{u manager.action=async()=>wait{u paymentDraftHub.Clients.All.sendaync(signarconstants.TransferPaymentDraftServiceData,wait{u paymentTransactionRepository.GetAllDeclinedAsync(pageSize,pageNumber));
}
var response=newresponsemessage{Message=“Accepted”,Code=“201”};
返回Ok(响应);
}

我没有时间测试这个解决方案,所以它甚至可能无法编译,但它确实给了您一个想法。

为了清楚起见:您使用不同的查询参数调用GET两次,您希望您的DataManager在第一次得到正确答案后更新查询参数?@GuillaumeCR没错。所以,我们的想法是检查请求是否已经存在,然后不要再次创建对象并使用现有对象。我会试试这个,让你们知道。感谢纪尧姆的指导,我在再次初始化它之前已经处理好了计时器,这很好。