Func<T>.BeginInvoke使用线程池吗?

23

在 C# 中,当您调用 Func 委托(或 Action 委托)的 BeginInvoke 方法时,运行时会使用线程池还是生成新的线程?

我几乎可以确定它会使用线程池,因为这是合乎逻辑的做法,但如果有人能够确认一下,我会非常感激。

谢谢。

2个回答

32

它肯定使用了线程池。

我找不到相关文档,但是这篇MSDN文章表明,您指定的任何回调函数都将在线程池线程上执行...

以下是一些代码以确认它 - 当然,这并不保证它一定会以这种方式执行...

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
    }
}

编辑:正如Jeff在下面链接的那样,这篇MSDN文章证实:

如果调用BeginInvoke方法, 公共语言运行时(CLR) 将请求放入队列中并立即返回 给调用者。目标方法将异步地 在线程池中的线程上调用。


10
如果调用BeginInvoke方法,公共语言运行时(CLR)将请求排队,并立即返回给调用者。目标方法将异步在线程池中的一个线程上调用。 - Jeff Sternal
@Jeff:谢谢。之前没找到那个页面。已经添加链接了。 - Jon Skeet

-6

“在创建控件的基础句柄的线程上异步执行指定的委托。”- MSDN

以上是针对控件的,但可能也可以假定对于 Func 的功能是相同的。BeginInvoke 允许您从另一个线程执行您的 Func,但不会为您创建线程。所以 Jon Skeet 是正确的。除非您正在创建用于异步执行的线程,否则我甚至不会使用此功能,因为它不会比调用 Invoke 更有优势。


6
不能假定委托的功能与控件相同。对于委托,不存在所谓的“控件底层句柄创建的线程”。Control.BeginInvoke 和 Delegate.BeginInvoke 有很大的区别。 - Jon Skeet
1
实际上......有时在命名混乱的大文件中,_someControl.BeginInvoke 可能会与 _someAction.BeginInvoke 混淆。 - Radu D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接