【发布时间】:2010-08-24 12:58:56
【问题描述】:
当您在 C# 中调用 Func 委托(或相关的 Action 委托)上的 BeginInvoke 方法时,运行时是使用 ThreadPool 还是产生新线程?
我几乎可以肯定它将使用 ThreadPool,因为这是合乎逻辑的做法,但如果有人能证实这一点,我将不胜感激。
谢谢,
【问题讨论】:
标签: c# .net multithreading delegates
当您在 C# 中调用 Func 委托(或相关的 Action 委托)上的 BeginInvoke 方法时,运行时是使用 ThreadPool 还是产生新线程?
我几乎可以肯定它将使用 ThreadPool,因为这是合乎逻辑的做法,但如果有人能证实这一点,我将不胜感激。
谢谢,
【问题讨论】:
标签: c# .net multithreading delegates
它肯定使用线程池。
如果我能找到记录在案,我会感到震惊,请注意...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 上异步调用 线程池中的线程。
【讨论】:
“在创建控件的基础句柄的线程上异步执行指定的委托。” - MSDN
以上是针对控件的,但可能也可以假设对于 Func 具有相同的功能。 BeginInvoke 允许您从另一个线程执行您的 Func,但不会为您创建线程。所以 Jon Skeet 是正确的。除非您为异步执行创建线程,否则我什至不会使用此功能,因为仅调用 Invoke 不会给您带来任何好处。
【讨论】: