0

我想制作一个在 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)
                {
                }
            }
        }
    }
4

0 回答 0