Использует ли Func <T>.BeginInvoke ThreadPool? - PullRequest
20 голосов
/ 24 августа 2010

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

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

Спасибо,

Ответы [ 2 ]

29 голосов
/ 24 августа 2010

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

Я ошеломлен, если смогу найти то, что задокументировано в любом случае. ...

Вот код для его подтверждения, но, конечно, это не подтверждает, что гарантировано произойдет таким образом ...

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) ставит в очередь запрос и возвращает немедленно звонящему. Цель метод вызывается асинхронно на поток из пула потоков.

0 голосов
/ 24 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...