简体   繁体   English

将System.Timer添加到System.Threading.RegisterWaitForSingleObject

[英]Adding System.Timer to System.Threading.RegisterWaitForSingleObject

How can I add System.Timer to System.Threading.RegisterWaitForSingleObject to run my thread after an interval time? 我如何添加System.TimerSystem.Threading.RegisterWaitForSingleObject的间隔时间后运行我的线程? In the code below, how do I specify the System.Timer[] timer object? 在下面的代码中,如何指定System.Timer[]计时器对象? Thanks. 谢谢。

int lvCtlrIdStart = 0;
int lvCtlrIdEnd = 0;
object s_range = null;

for (int i = 0; i < NbrOfThrds - 1; i++)
                    {
    m_WorkerEvtThreads[i] = new ManualResetEvent(false);
    int dueTime = int.Parse(lvTask.ctlrArray[i, 3].ToString());

    lvCtlrIdStart = int.Parse(lvTask.ctlrArray[i, 0].ToString());
    lvCtlrIdEnd = int.Parse(lvTask.ctlrArray[i, 1].ToString());
    s_range = $"{lvCtlrIdStart},{lvCtlrIdEnd}";
    dueTime = int.Parse(lvTask.ctlrArray[i, 3].ToString());
    Action<int> m_workerThread = (sqm) =>
    {
        lvTask.WaitHandle = ThreadPool.RegisterWaitForSingleObject(m_SpecialWorkerEventThread, 
            new WaitOrTimerCallback(m_SendQueuedMsgs), s_range, 0, true);
    };
    timer[i].Change(dueTime, Timeout.Infinite);
}

I found a way to resolve this: 我找到了解决此问题的方法:

        int dueTime = int.Parse(lvTask.ctlrArray[0, 3].ToString());
        int lvCtlrIdStart = 0;
        int lvCtlrIdEnd = 0;
        object s_range = $"{lvCtlrIdStart},{lvCtlrIdEnd}";

        bool bIntvlStart = false;
        m_WorkerEvtThreads = new AutoResetEvent[NbrThrds];                                      // reset ALL events before looping into the next sets of Threadpool
        CancellationTokenSource cts = new CancellationTokenSource();                            // Create the token source
        for (int i = 0; i < NbrThrds; i++)                                                      // Iterate based on the number of tasks to run
        {
            try
            {
                int intvlStart = 1000 * i;                                                          // delay before my callback method is invoked..
                dueTime = bIntvlStart ? int.Parse(lvTask.ctlrArray[i, 3].ToString()) : intvlStart;  // first loop is (1000 * loop_count) sec stagger run, otherwise kickoff on interval time
                m_WorkerEvtThreads[i] = new AutoResetEvent(false);                              // initial each thread event
                m_WorkerEvtThreads[i].Reset();
                Thread.Sleep(WaitHandle.WaitTimeout);                                           // sleep 258ms...
                CurrentInstance = int.Parse(lvTask.ctlrArray[i, 2].ToString()) - 1;             // get the current instance
                lvCtlrIdStart = int.Parse(lvTask.ctlrArray[i, 0].ToString());                   // start controller ID
                lvCtlrIdEnd = int.Parse(lvTask.ctlrArray[i, 1].ToString());                     // end controller ID
                s_range = $"{lvCtlrIdStart},{lvCtlrIdEnd}";                                     // combine to pass to SendQueueMessage()
                ThreadPool.QueueUserWorkItem(delegate 
                                            {   Thread.CurrentThread.Name = $"LV Instance {CurrentInstance}";
                                                lvTask.TN = $"{Thread.CurrentThread.Name}";               // name the current instance task
                                                m_ThreadName = $"{lvTask.TN}";
                                                TimerSendQueueMsgCallback(s_range, intvlStart, dueTime);    // Call the timer callback method
                                            }, cts.Token);                                                  // cancellation token
            }
            catch (Exception ex)
            {
                log.WriteLineToBuf(ref logBuf, $"Exception: OnLvMessage() - {ex.Message}");
            }
        }
        cts.Cancel();                                                                                       // request cancellation...  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM