我有Dictionary<string, Queue<Action>>
,这个dict会动态添加数据,具体取决于数据库中是否有新数据。
现在Dictionary<string, Queue<Action>>
中的数据如下所示:
"1",{A1,A2,A3,A4}
"2",{B1,B2,B3}
"3",{C1,C2}
我的程序将每隔10秒检查一次该字典并从字典中执行Dequeue操作,然后执行Invoke操作。执行角色如下:
现在我的代码如下:
//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();
}
});
}
}
修改
THX。 为此,我有一个解决方案,创建3个线程并使用AutoResetEvent数组来同步队列执行。但如果dict中有数以千计的物品,那将不是一个好主意。
这是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);
}