It uses the thread pool, definitely.
I'm blowed if I can find that documented anyway, mind you... this MSDN article indicates that any callback you specify will be executed on a thread-pool thread...
Here's some code to confirm it - but of course that doesn't confirm that it's guaranteed to happen that way...
using System;
using System.Threading;
public class Test
{
static void Main()
{
Action x = () =>
Console.WriteLine(Thread.CurrentThread.IsThreadPoolThread);
x(); // Synchronous; prints False
x.BeginInvoke(null, null); // On the thread-pool thread; prints True
Thread.Sleep(500); // Let the previous call finish
}
}
EDIT: As linked by Jeff below, this MSDN article confirms it:
If the BeginInvoke method is called,
the common language runtime (CLR)
queues the request and returns
immediately to the caller. The target
method is called asynchronously on a
thread from the thread pool.