Группировка потоков в пул
Обновлен: Ноябрь 2007
Группировка потоков в пол является формой многопоточности, при которой задачи добавляются в очередь и автоматически запускаются при создании новых потоков. Используя группировку потоков в пул, можно вызвать метод ThreadPool.QueueUserWorkItem с делегатом для процедуры, которую требуется выполнить, а Visual Basic создаст поток и выполнит процедуру.
Пример группировки потоков в пул
Следующий пример показывает, как можно использовать группировку потоков в пул для запуска нескольких задач.
Sub DoWork()
' Queue a task
System.Threading.ThreadPool.QueueUserWorkItem( _
New System.Threading.WaitCallback(AddressOf SomeLongTask))
' Queue another task
System.Threading.ThreadPool.QueueUserWorkItem( _
New System.Threading.WaitCallback(AddressOf AnotherLongTask))
End Sub
Sub SomeLongTask(ByVal state As Object)
' Insert code to perform a long task.
End Sub
Sub AnotherLongTask(ByVal state As Object)
' Insert code to perform another long task.
End Sub
Группировка потоков удобна, когда необходимо запустить несколько отдельных задач без указания индивидуальных свойств каждого потока. Каждый поток запускается с приоритетом и размером стека, заданными по умолчанию. По умолчанию на одном процессоре системы могут выполняться до 25 потоков, входящих в пул. Дополнительные потоки сверх этого ограничения могут быть поставлены в очередь, но они не будут запущены до завершения работы других потоков.
Одно из преимуществ группировки потоков заключается в возможности передачи аргументов в процедуру задачи в виде объекта состояния. Если вызываемой процедуре требуется нескольких аргументов, можно привести структуру или экземпляр некоторого класса к типу данных Object.
Параметры и возвращаемые значения пула потоков
Получение возвращаемого значения из пула потоков является не такой простой задачей. Стандартный способ получения возвращаемого значения при вызове функции использовать нельзя, поскольку помещать в очередь на выполнение в пуле потоков можно только процедуры Sub. Один из способов обеспечить передачу параметров и возвращения значений — это заключение параметров, возвращаемых значений и методов в класс-оболочку (см. раздел Параметры и возвращаемые значения для многопоточных процедур).
Более простым способом передачи параметров и возвращаемых значений является использование необязательной переменной состояния объекта типа ByVal метода QueueUserWorkItem. Если эта переменная используется для передачи ссылки на экземпляр класса, члены экземпляра могут быть изменены потоком, входящим в пул потоков, и использоваться в качестве возвращаемых значений.
На первый взгляд возможность изменения объекта, на который ссылается переданная по значению переменная, не является очевидной. На самом деле это возможно, потому что по значению передается только ссылка на объект. При изменении членов объекта, указанного в ссылке, изменения применяются к реальному экземпляру класса.
Структуры, входящие в состав объектов состояния, нельзя использовать для получения возвращаемых значений. Поскольку структуры являются типами, передаваемыми по значению, изменения, вносимые асинхронным процессом, не влияют на члены исходной структуры. Структуры следует использовать для передачи параметров, когда не требуется получать возвращаемые значения.
См. также
Основные понятия
Дополнительные возможности управления многопоточностью в Visual Basic
Использование многопоточности для форм и элементов управления