[英]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.Timer
到System.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.