In terms of staging threading, we don't really have much choice. It has to be done with the inner pieces first. The inner most pieces are roughly file I/O, Regex, misc lib routines, parsing, and tagging. If we want to ship any features, we'll need to do something with threaded tagging. Automatically retagging the workspace on a thread is an obvious nice feature to have especially if you have a wildcard project. I hear you though, this is nice to have since you can work around this one with a small amount of manual intervention.
Understood, makes perfect sense.
Re: wildcard projects, that is another scalability challenge, and mikesart and myself have attempted to address that with the sync_project_with_scm macro (
forum link). Threading wildcard scans might address that, I haven't thought about it in much depth yet.
Threading references will be quite the challange but would be very valuable. Features like references and symbol coloring require analyzing the symbol at its actual file location to get all the context information. A lot of this is currently done in Slick-C.
Threading seems an appropriate long term direction. In the meantime, finding references can still show progress and avoid blocking the user, without using threading. I implemented background find in files in another editor without using other threads or processes, and here is an attempt to translate that work into the context of finding references:
1. User presses Ctrl+/ on a symbol.
2. Collect potential hits from the tagfile, keep them in an array or whatever for processing.
3. Process hits from the current file.
4. Use a timer or _post_call to defer the rest of the processing.
>> User regains control, and can interact with the editor and with the References toolbar and the references that it lists so far.
5. On idle, the deferred call gets performed.
6. If the editor has been idle for less than 100ms, return immediately and wait for the next timer event or use _post_call again, etc -- there are details here to work out, but the that's the gist.
7. In the deferred call:
8. Show progress on the status line: "Processing potential hits, on X of Y".
9. Process a small number (1? 5? 10? configurable?) of potential hits (but no more than 1 file's worth per call, because opening a file can be relatively expensive).
10. When a hit is confirmed, add it to the list in the References toolbar.
If I find the time, I may work on coding this up myself and send in a patch for the SlickTeam to polish up (especially places where I may have made overly narrow assumptions

.
My thoughts have been to move that code out of Slick-C but Dennis thinks we might be able to thread Slick-C. Because Slick-C is a copy by value language and not a reference language like (java, python, C#), this is doable. In any case, we have options. None are trivial but it's doable.
Oh very interesting indeed. Should be fun to see where the editor stands in another 5 years.
As for Smart Open, your EnjProj macro proves that our current implementation of Smart Open isn't optimized enough. Thanks to you, I can hand this to a developer and say, "make it this fast!". Hopefully, we'll have something by 14.0.1 
Cool.

In case it wasn't noticed, EnhProj.zip includes full native code source for the DLL. If a developer has any questions about the macro or code, feel free to contact me at my private email (if you can't get it from the forum member info, Shannon/Mike/Ashley in support know it).