views:

98

answers:

2

When you call the BeginInvoke method on a Func delegates (or the Action delegates for that matter) in C#, does the runtime use the ThreadPool or spawn a new thread?

I'm almost certain that it'll use the ThreadPool as that'd be the logical thing to do but would appreciate it if someone could confirm this.

Thanks,

+6  A: 

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.

Jon Skeet
From [Asynchronous Programming Using Delegates](http://msdn.microsoft.com/en-us/library/22t547yb.aspx): "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."
Jeff Sternal
@Jeff: Thanks. Didn't find that page before. Duly linked.
Jon Skeet
A: 

"Executes the specified delegate asynchronously on the thread that the control's underlying handle was created on." - MSDN

The above is for Controls, but probably can be assumed to be the same functionality for Func's as well. BeginInvoke allows you to execute of your Func from another Thread, but won't create threads for you. So Jon Skeet would be correct. Unless you are creating threads for asynchronous execution I wouldn't even use this feature cause it won't buy you anything over just calling Invoke.

Khalid Abuhakmeh
No, it definitely *can't* be assumed to be the same functionality for delegates. There's no such thing as "the thread that the control's underlying handle was created on" for delegates. Control.BeginInvoke and Delegate.BeginInvoke are very different.
Jon Skeet