当您在C#中调用Func委托(或Action代理)上的BeginInvoke方法时,运行时是否使用ThreadPool或生成新线程?
我几乎可以肯定它会使用ThreadPool,因为这是合乎逻辑的事情,但如果有人能证实这一点,我会很感激。
谢谢,
答案 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来为您购买任何东西。