【问题标题】:Does Func<T>.BeginInvoke use the ThreadPool?Func<T>.BeginInvoke 是否使用线程池?
【发布时间】:2010-08-24 12:58:56
【问题描述】:

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

我几乎可以肯定它将使用 ThreadPool,因为这是合乎逻辑的做法,但如果有人能证实这一点,我将不胜感激。

谢谢,

【问题讨论】:

    标签: c# .net multithreading delegates


    【解决方案1】:

    它肯定使用线程池。

    如果我能找到记录在案,我会感到震惊,请注意...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 上异步调用 线程池中的线程。

    【讨论】:

    • 来自Asynchronous Programming Using Delegates:“如果调用了BeginInvoke方法,公共语言运行时(CLR)将请求排队并立即返回给调用者。目标方法在线程上从线程异步调用游泳池。”
    • @Jeff:谢谢。之前没找到那个页面。正确链接。
    【解决方案2】:

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

    以上是针对控件的,但可能也可以假设对于 Func 具有相同的功能。 BeginInvoke 允许您从另一个线程执行您的 Func,但不会为您创建线程。所以 Jon Skeet 是正确的。除非您为异步执行创建线程,否则我什至不会使用此功能,因为仅调用 Invoke 不会给您带来任何好处。

    【讨论】:

    • 不,绝对不能假定代表具有相同的功能。对于委托,没有“创建控件底层句柄的线程”之类的东西。 Control.BeginInvoke 和 Delegate.BeginInvoke 非常不同。
    • 确实......有时在命名约定不好的大文件中,_someControl.BeginInvoke 可能会与 _someAction.BeginInvoke 混淆
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多