Func <t> .BeginInvoke是否使用ThreadPool?</t>

时间:2010-08-24 12:58:56

标签: c# .net multithreading delegates

当您在C#中调用Func委托(或Action代理)上的BeginInvoke方法时,运行时是否使用ThreadPool或生成新线程?

我几乎可以肯定它会使用ThreadPool,因为这是合乎逻辑的事情,但如果有人能证实这一点,我会很感激。

谢谢,

2 个答案:

答案 0 :(得分:28)

它肯定使用线程池。

如果我能找到记录的话,我会感到很震惊,请注意...... this MSDN article表示您指定的任何回调将在线程池线程上执行...

这里有一些代码可以确认 - 但当然并不能确认保证以这种方式发生......

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在下面所链接的那样,this MSDN article证实了这一点:

  

如果调用BeginInvoke方法,   公共语言运行库(CLR)   对请求进行排队并返回   立即给来电者。目标   方法在a上异步调用   来自线程池的线程。

答案 1 :(得分:-6)

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

以上是针对控件的,但也可以假设Func的功能相同。 BeginInvoke允许您从另一个Thread执行您的Func,但不会为您创建线程。所以Jon Skeet是正确的。除非您正在为异步执行创建线程,否则我甚至不会使用此功能,因为它不会仅仅通过调用Invoke来为您购买任何东西。