Confused about Coroutines

I'm almost convinced I'm seeing a bug, but this is an entirely new concept for me, so I need some help to understand what's going on. Here's a somewhat simplified version:

static function Initialize() 
{
    Debug.Log("EventManager.Initialize() called");
    if (initialized) return;
    Debug.Log("EventManager.Initialize() 1");       
    eventQueue = new PriorityQueue();
    initialized = true;
    Debug.Log("EventManager.Initialize() 2");
    DoLoop();
    Debug.Log("EventManager.Initialize() 3");
 }

static private function DoLoop()
{
    Debug.Log("Enter Loop()");
    while (true) {
        Debug.Log("Top of Loop() loop");
        while (eventQueue.Count) {
            // do something useful
        }
        Debug.Log("Before Loop() wait");
        yield WaitForSeconds(1.0);
    }
    Debug.Log("Exit Loop()");
}

What's weird is I never see "Enter Loop()" in the console (or anything from DoLoop()), but I see the "Initialize 1", 2, and 3. If I comment out the while (true) loop, I'll see both the "Enter Loop()" and "Exit Loop()", but otherwise neither. What's going on?

When a coroutine is called, it does not automatically run through to completion. It returns the body of the routine embedded in an object implementing the `IEnumerator` interface. Each time `MoveNext` is called on the object, the coroutine continues until the next `yield`, and returns the yield argument (in your case an instance of `WaitForSeconds`).

When writing scripts in C#, this is explicit. You have to start a corutine with `StartCoroutine(coroutine());`, where the IEnumerator is passed to the unity engine, and called at the appropriate times depending on the `[YieldInstructions][2]` returned from the IEnumerator.

In Javascript, I believe the compiler determines which routines are coroutines, and automatically calls StartCoroutine automatically, however apparently not from static routines.

TLDR; do as Eric suggested, remove both instances of static.

Remove both instances of "static".