public void TraceEvent(TraceEventType eventType, int id)
        {
            // Ensure that config is loaded
            Initialize();

            if (internalSwitch.ShouldTrace(eventType) && listeners != null)
            {
                if (TraceInternal.UseGlobalLock)
                {
                    // we lock on the same object that Trace does because we're writing to the same Listeners.
                    lock (TraceInternal.critSec) {
                        for (int i = 0; i < listeners.Count; i++)
                        {
                            TraceListener listener = listeners[i];
                            listener.TraceEvent(manager, Name, eventType, id);
                            if (Trace.AutoFlush)
                            {
                                listener.Flush();
                            }
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < listeners.Count; i++)
                    {
                        TraceListener listener = listeners[i];
                        if (!listener.IsThreadSafe)
                        {
                            lock (listener) {
                                listener.TraceEvent(manager, Name, eventType, id);
                                if (Trace.AutoFlush)
                                {
                                    listener.Flush();
                                }
                            }
                        }
                        else
                        {
                            listener.TraceEvent(manager, Name, eventType, id);
                            if (Trace.AutoFlush)
                            {
                                listener.Flush();
                            }
                        }
                    }
                }
                manager.Clear();
            }
        }