我有一个Dictionary<string, Queue<Action>>
,这个字典会根据数据库中是否有新数据动态添加数据。现在数据Dictionary<string, Queue<Action>>
如下:
"1",{A1,A2,A3,A4}
"2",{B1,B2,B3}
"3",{C1,C2}
我的程序将每 10 秒检查一次该字典,并从字典中执行 Dequeue 操作,然后执行 Invoke 操作。执行角色如下:
- A1,B1,C1 将首先执行。
- 如果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);
}