private void DoProcessQueue(object state)
{
Queue<AeEvent> events = new Queue<AeEvent>();
try
{
// check if disposed.
if (m_disposed)
{
return;
}
// process the queue.
lock (m_queue)
{
while (m_queue.Count > 0)
{
events.Enqueue(m_queue.Dequeue());
}
}
// check if time for a keep alive.
lock (m_lock)
{
// check if time for keep alive.
if (events.Count == 0)
{
if (KeepAlive == 0 || m_lastUpdateTime.AddMilliseconds(KeepAlive*m_keepAliveCount) > DateTime.UtcNow)
{
return;
}
}
// no keep alives if not active.
if (!Active)
{
return;
}
// update counters.
if (events.Count > 0)
{
m_lastUpdateTime = DateTime.UtcNow;
m_keepAliveCount = 1;
}
else
{
m_keepAliveCount++;
}
}
// send a keep alive callback.
if (events.Count == 0)
{
IComAeEventCallback callback = m_callback;
if (callback != null)
{
callback.OnEvent(
ClientHandle,
false,
false,
null);
}
return;
}
// send the events to client.
SendInBlocks(m_callback, events, MaxSize, false);
}
catch (Exception exception)
{
Utils.Trace(exception, "Error processing event callback.");
}
}