0

我有一个Dictionary<string, Queue<Action>>,这个字典会根据数据库中是否有新数据动态添加数据。现在数据Dictionary<string, Queue<Action>>如下:

"1",{A1,A2,A3,A4}
"2",{B1,B2,B3}
"3",{C1,C2}

我的程序将每 10 秒检查一次该字典,并从字典中执行 Dequeue 操作,然后执行 Invoke 操作。执行角色如下:

  1. A1,B1,C1 将首先执行。
  2. 如果A1完成,则开始执行A2;如果B1完成,则开始执行B2;如果C1完成,则开始执行C2;他们不需要等待另一个人的完成。

现在我的代码如下:

 //This function is to add new data into dictionary if data comes
 private void DoComparison(StuffEntity entity)
    {
        try
        {
            bool dataFlag = CheckIsNewData(entity.PickingTime, entity.WarningPeriod);
            if (dataFlag)  
            {
                Action action = () => { DelaySendingMessageOut(entity); };
                if (!QueueItem.ContainsKey(entity.FridgeID))
                {
                    Queue<Action> queue = new Queue<Action>();
                    queue.Enqueue(action);
                    QueueItem.Add(entity.FridgeID, queue);
                }
                else
                {
                    QueueItem[entity.FridgeID].Enqueue(action);
                }
            }
        }
        catch (Exception ex)
        {
            CommonUnity.WriteLog(ex.Message);
            CommonUnity.WriteLog(ex.StackTrace);
        }
    }


  //This function is to check the Dictionary
  //And this function will be checked every 10 seconds.
    private void CheckingQueue()
    {
        foreach (KeyValuePair<string, Queue<Action>> kvp in QueueItem)
        {
            string fridgeID = kvp.Key;
            Queue<Action> queue = kvp.Value;

            ThreadPool.QueueUserWorkItem((_) =>
            {
                if (queue.Count > 0)
                {
                   //How can I know that the previous work has been finished?
                    queue.Dequeue().Invoke();
                }
            });
        }
    }

编辑:

在此处输入图像描述

谢谢。为此,我有一个解决方案,创建 3 个线程并使用 AutoResetEvent 数组来同步队列执行。但如果字典中有数千个项目,这将不是一个好主意。

这是 DelaySendingMessageOut 函数的代码:

private void DelaySendingMessageOut(StuffEntity entity)
    {
        int pendingPeroid = entity.PendingTime.ToInt();
        if (pendingPeroid <= 0)
            pendingPeroid = 5; 

        Thread.Sleep(pendingPeroid * 60 * 1000); //delay sending

        TriggerCheckingBeforeSendMessageOut(entity);
    }
4

0 回答 0