Does Func<T>.BeginInvoke use the ThreadPool?

一个人想着一个人 提交于 2019-12-28 13:42:05

问题


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,


回答1:


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.




回答2:


"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.



来源:https://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!