Темы, которые запускают код с 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-х диалогов. Первые четыре раза вы удаляете один из них, нажимая «ОК», появляется другое диалоговое окно (с тем же идентификатором потока), когда поток закрытого диалога возвращается в пул.
Спасибо, что показали мне доказательство концепции! – Achilles