Multithreading extensions
You should consider what happens when a user passes an action which can error:

new List&lt;string&gt; { "a", "b", "c" }.Foreach(_ =&gt; { throw new Exception(); });


In this case, your manual reset event will never be signalled and the code will never finish executing. Eeek!

As ManualResetEventSlim was introduced in .Net 4 you may as well use another class that was new at the same time CountdownEvent.

public static void Foreach&lt;T&gt;(this ICollection&lt;T&gt; source, Action&lt;T&gt; action)
{
    var allDone = new CountdownEvent(source.Count);
    foreach (var item in source)
    {
        ThreadPool.QueueUserWorkItem(state =&gt;
        {
            try
            {
                action((T)state);
            }
            finally
            {
                allDone.Signal();
            }
        }, item);
    }
    allDone.Wait();
}


Having said that Foreach is a bad name, it's too similar to List.ForEach and doesn't even hint at the internal behaviour.

You should be checking that source != null and action != null.

Update:
If you want to catch exceptions and rethrow them as an AggregateException, add them to a concurrent collection e.g. ConcurrentBag so you don't need to worry about synchronisation.