CountdownLatch Thread-Safety Check
The Good
I don't write multithreaded code very often, so other reviewers will probably have other comments (read: I'm a multithreading beginner myself), but I like what I'm seeing.

Interlocked.Increment(ref this._number);


I don't see anything that could go wrong with this. This is how I've read a thread-safe increment should be done, using the Interlocked class.

while (Interlocked.CompareExchange(ref this._number, currentNumber - 1, currentNumber) != currentNumber)


Looks good to me. currentNumber belongs to the thread that's running this, so no thread can mess with that currentNumber while currentNumber - 1 or CompareExchange is being evaluated, and again the Interlocked class at play has my full trust.

The Bad
Ignorance is bliss, nothing in sight.

The Ugly
The very first thing that jumped at me, is the abundance of redundant this qualifiers. They're not needed, you have underscores:

int _number;
readonly ManualResetEventSlim _event;


I like the underscore prefix, because it allows me to have a _number field and a number parameter or local variable, for example:
public CountdownLatch(ManualResetEventSlim event)
{
    _event = event;
}

The way I read currentNumber, &quot;current&quot; stands for &quot;current thread's working copy of _number&quot;. I find the name number conveys that more succinctly.