private void SlowTimerCallback(object state) { try { int start = m_timerTickStart; GameTimer timer = m_currentTimer; if (timer == null) { return; } StringBuilder str = new StringBuilder("=== Timer already took ", 1024); str.Append(GetTickCount() - start).Append("ms\n"); str.Append(timer.ToString()); str.Append("\n\n"); str.Append("Timer thread:\n"); str.Append(Util.FormatStackTrace(Util.GetThreadStack(m_timeThread))); string packetStacks = PacketHandler.PacketProcessor.GetConnectionThreadpoolStacks(); if (packetStacks.Length > 0) { str.Append("\n\nPackethandler threads:\n"); str.Append(packetStacks); } str.Append("\n\nNPC update thread:\n"); str.Append(Util.FormatStackTrace(WorldMgr.GetNpcUpdateStacktrace())); str.Append("\n\nRelocation thread:\n"); str.Append(Util.FormatStackTrace(WorldMgr.GetRelocateRegionsStacktrace())); str.Append("\n\n"); lock (m_delayLog) { m_delayLog.Write(str.ToString()); m_delayLog.Flush(); } } catch (Exception e) { if (log.IsWarnEnabled) { log.Warn("collecting/writing timer delays", e); } } }