0

我有一个状态机,其中包含我想跨多个状态传递数据的数据。其中一些状态将添加到任务队列中进行处理。这是我的后台队列服务。

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

任何意见,将不胜感激。

4

0 回答 0