我必须编写一个程序,从数据库中读取要处理的队列,并且所有队列都并行运行并使用 ConcurrentDictionary 在父线程上进行管理。我有一个代表队列的类,它有一个接受队列信息和父实例句柄的构造函数。队列类也有处理队列的方法。
这是队列类:
Class MyQueue {
protected ServiceExecution _parent;
protect string _queueID;
public MyQueue(ServiceExecution parentThread, string queueID)
{
_parent = parentThread;
_queueID = queueID;
}
public void Process()
{
try
{
//Do work to process
}
catch()
{
//exception handling
}
finally{
_parent.ThreadFinish(_queueID);
}
父线程循环遍历队列数据集并实例化一个新的队列类。它产生一个新线程来异步执行 Queue 对象的 Process 方法。将此线程添加到 ConcurrentDictionary 中,然后按如下方式启动:
private ConcurrentDictionary<string, MyQueue> _runningQueues = new ConcurrentDictionary<string, MyQueue>();
Foreach(datarow dr in QueueDataset.rows)
{
MyQueue queue = new MyQueue(this, dr["QueueID"].ToString());
Thread t = new Thread(()=>queue.Process());
if(_runningQueues.TryAdd(dr["QueueID"].ToString(), queue)
{
t.start();
}
}
//Method that gets called by the queue thread when it finishes
public void ThreadFinish(string queueID)
{
MyQueue queue;
_runningQueues.TryRemove(queueID, out queue);
}
我觉得这不是管理异步队列处理的正确方法,我想知道这种设计是否会陷入死锁?此外,我想使用任务来异步运行队列而不是新线程。我需要跟踪队列,因为如果上一次运行尚未完成,我不会为同一个队列生成新线程或任务。处理这种并行性的最佳方法是什么?
提前致谢!