Подтвердить что ты не робот

Использует ли Func <T>.BeginInvoke ThreadPool?

Когда вы вызываете метод BeginInvoke для делегатов Func (или делегатов Action в этом случае) на С#, использует ли среда выполнения ThreadPool или создает новый поток?

Я почти уверен, что он будет использовать ThreadPool, поскольку это было бы логичным делом, но было бы признательно, если бы кто-то смог подтвердить это.

Спасибо,

4b9b3361

Ответ 1

Он использует пул потоков, определенно.

Меня взорвут, если я смогу найти это документально, неважно, эта статья 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
    }
}

РЕДАКТИРОВАТЬ: Как указано Джеффом ниже, эта статья MSDN подтверждает это:

Если вызывается метод BeginInvoke, общая среда выполнения CLR (CLR) очереди запроса и возвращает немедленно вызывающему абоненту. Цель метод называется асинхронно на поток из пула потоков.

Ответ 2

"Выполняет заданный делегат асинхронно в потоке, над которым был создан управляющий базовый дескриптор." - MSDN

Вышеупомянутое относится к элементам управления, но, вероятно, можно предположить, что они одинаковы для Func. BeginInvoke позволяет выполнять ваш Func из другого потока, но не будет создавать потоки для вас. Так что Джон Скит был бы прав. Если вы не создаете потоки для асинхронного выполнения, я бы даже не использовал эту функцию, потому что она не купит вам ничего, просто вызвав Invoke.