Какие темы живут в .NET ThreadPool? - PullRequest
0 голосов
/ 03 января 2011

Существует несколько способов выполнения асинхронных потоков в .NET:

System.Threading.Thread.Start ()

System.Delegate.BeginInvoke ()

Мой вопрос: где асинхронные потоки живут в каждом из этих сценариев? В некоторых случаях я хочу избегать использования потоков в пуле, потому что некоторые процессы, которые я выполняю, занимают много времени и будут обязывать поток в пуле.

Ответы [ 4 ]

4 голосов
/ 03 января 2011

Потоки, которые запускают код, вызванный из Delegate.BeginInvoke, существуют в том же пуле, что и те, к которым обращаются из класса ThreadPool. Создание собственного Thread объекта делает именно это: создает новый (не объединенный в пул) поток.

Вот быстрый способ убедиться в этом: создайте новое приложение Windows Forms и поместите в форму две кнопки. Включите что-то вроде следующего кода:

private void ThreadStartButton_Click(object sender, EventArgs e)
{
    ThreadPool.SetMaxThreads(4, 4);
    for (int i = 0; i < 8; ++i)
    {
        Thread t = new Thread(ShowMessageBox);
        t.Start();
    }
}

private void DelegateBeginInvokeButton_Click(object sender, EventArgs e)
{
    ThreadPool.SetMaxThreads(4, 4);
    for (int i = 0; i < 8; ++i)
    {
        Action action = ShowMessageBox;
        action.BeginInvoke(action.EndInvoke, null);
    }
}

private void ShowMessageBox()
{
    int threadId = Thread.CurrentThread.ManagedThreadId;
    MessageBox.Show(threadId.ToString());
}

При нажатии на первую кнопку (ту, чей обработчик создает новые Thread объекты), вы должны увидеть 8 всплывающих диалогов одновременно. При нажатии на второй (который вызывает BeginInvoke), вы должны увидеть до 4 диалоговых окон. Первые четыре раза, когда вы закрываете один из них, нажимая «ОК», должен появиться другой диалог (с тем же идентификатором потока), когда поток закрытого диалога возвращается в пул.

3 голосов
/ 03 января 2011

Когда вы используете Thread.Start (), этот поток отделен от ThreadPool. Когда вы используете BeginInvoke, (IIRC) вызов передается в пул потоков. То же самое с QueueUserWorkItem.

2 голосов
/ 03 января 2011

В первом сценарии они нигде не живут.Вы вручную создаете новую тему.Во втором примере поток рисуется из пула потоков, если таковой имеется.Вам следует избегать использования потоков из пула потоков в многопоточных приложениях, таких как ASP.NET, для длительных операций, поскольку вы можете поставить под угрозу потоки, которые также используются для обслуживания запросов.

Основное правило заключается в следующем:вручную создайте потоки для длительных операций, но их мало (поскольку создание потока занимает много времени), и используйте потоки из пула для нескольких краткосрочных операций.

0 голосов
/ 03 января 2011
System.Threading.Thread.Start()

Включает создание потока, которого нет в пуле.

System.Delegate.BeginInvoke() будет зависеть от фактической реализации, которая может быть пулом потоков, фоном или потоком переднего плана.

Если вы объясните свой случай, мы сможем помочь вам больше.

...