我有一个状态机,其中包含我想跨多个状态传递数据的数据。其中一些状态将添加到任务队列中进行处理。这是我的后台队列服务。
public class BackgroundTaskQueue : IBackgroundJobTaskQueue
{
private ConcurrentQueue<Tuple<State, Data>> _workItems =
new ConcurrentQueue<Tuple<State, Data>>();
private SemaphoreSlim _signal = new SemaphoreSlim(0);
public void QueueBackgroundWorkItem(Tuple<State, Data> workItem)
{
if (workItem == null)
{
throw new ArgumentNullException(nameof(workItem));
}
_workItems.Enqueue(workItem);
_signal.Release();
}
public async Task<Tuple<State, Data>> DequeueAsync(CancellationToken cancellationToken)
{
await _signal.WaitAsync(cancellationToken);
_workItems.TryDequeue(out var workItem);
return workItem;
}
}
当我将状态排入后台工作器服务时,整个队列的Data属性会发生变化,并且不会保留该特定工作项的数据。
例子:
foreach (var item in SomeLoop)
{
BackgroundTaskQueue.QueueBackroundWorkItem(Tuple.Create<State,Data>(new WorkState(),item))
}
输出:
_workItems[0] = Tuple(WorkState(), 1);
但是,在循环的下一次迭代中,数据属性将为 2,并且它将队列中所有项目的值更改为 2。
输出:
_workItems[0] = Tuple(WorkState(), 2);
_workItems[1] = Tuple(WorkState(), 2);
它不保留队列中第一个工作项的原始数据对象值。
预期结果:
_workItems[0] = Tuple(WorkState(), 1);
_workItems[1] = Tuple(WorkState(), 2);
任何意见,将不胜感激。