我想制作一个在 ConcurrentQueue 中执行任务(方法)的队列管理器。队列管理器的功能是自动执行队列中的任何任务(方法)。为此,我尝试将任务(方法)传递到队列中,并尝试通过出队自动执行该任务(方法)。
这是主程序
public partial class TraderMain : Form
{
.
.
.
public static QueueManager _queueMgr ;
.
.
.
//it return instance and if it doesn't exist, make a instance
_queueMgr = SingletonBase<QueueManager>.Instance;
//start dequeueing
Task dequeueTask = Task.Factory.StartNew( () => { _queueMgr.Dequeue(); } );
.
.
.
BulkDataLoad bdl = new BulkDataLoad();
Task enqueueTask = Task.Factory.StartNew(() => bdl.sendRequestAllItemsInfo());
下面是 BulkDataLoad 的来源。
public int sendRequestAllItemsInfo()
{
foreach (CodeManager.MasterCode masterCode in lMasterCodes)
{
// enqueueing Tasks(method)
TraderMain._queueMgr.Enqueue(() => ActionWithCode(masterCode.Code));
我希望队列中的方法将通过出队自动执行。当我执行该程序时,工作并不完美。
入队效果很好。但是,出队是行不通的。当我调试程序时,调试器不会进入方法“ActionWithCode”。
我想要的是将任务作为参数传递给自动执行。不可能吗?如果是这样,我应该如何修改源?下面是 QueueManager 类源。
public class QueueManager
{
static readonly int REQUEST_DELAY = 10;
public ConcurrentQueue<Task> queueTR;
private QueueManager()
{
queueTR = new ConcurrentQueue<Task>();
}
public void Enqueue(Action action, CancellationToken cancelToken = default(CancellationToken))
{
Task task = new Task(action);
queueTR.Enqueue(task);
}
public void Dequeue()
{
while (true)
{
try
{
if (queueTR.TryDequeue(out Task result)) { Debug.WriteLine("> Queue : " + result); }
Thread.Sleep(REQUEST_DELAY);
}
catch (Exception ex)
{
}
}
}
}