线程池(C# 和 Visual Basic)

“线程池”是可以用来在后台执行多个任务的线程集合。 (有关背景信息,请参见线程处理(C# 和 Visual Basic)。)这使主线程可以自由地异步执行其他任务。

线程池通常用于服务器应用程序。 每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会占用主线程,也不会延迟后续请求的处理。

一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。 这种重用使应用程序可以避免为每个任务创建新线程的开销。

线程池通常具有最大线程数限制。 如果所有线程都繁忙,则额外的任务将放入队列中,直到有线程可用时才能够得到处理。

您可以实现自己的线程池,但是通过 ThreadPool 类使用 .NET Framework 提供的线程池更容易一些。

对于线程池,可使用要运行的过程的委托调用 ThreadPool.QueueUserWorkItem 方法,而 Visual Basic 或 C# 将创建线程并运行您的过程。

线程池示例

下面的示例说明如何使用线程池来启动几个任务。

Public 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
Private Sub SomeLongTask(ByVal state As Object)
    ' Insert code to perform a long task.
End Sub
Private Sub AnotherLongTask(ByVal state As Object)
    ' Insert code to perform another long task.
End Sub
public void DoWork()
{
    // Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(SomeLongTask));
    // Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(AnotherLongTask));
}

private void SomeLongTask(Object state)
{
    // Insert code to perform a long task.
}

private void AnotherLongTask(Object state)
{
    // Insert code to perform a long task.
}

线程池的一个优点是可以通过一个状态对象将参数传递到任务过程。 如果要调用的过程需要多个参数,可将结构或类的实例强制转换为 Object 数据类型。

线程池参数和返回值

不能直接从线程池线程返回值。 不允许使用通过调用函数来返回值的标准方法,因为 Sub 过程是唯一一种可以添加到线程池队列中的过程。 一种提供参数和返回值的方法是将参数、返回值和方法包装在一个包装类中,如 多线程过程的参数和返回值(C# 和 Visual Basic) 中所述。

另一种较为简单的提供方法是使用 QueueUserWorkItem 方法的可选 ByVal 状态对象变量。 如果使用此变量来传递对类实例的引用,则该实例的成员可以由线程池线程进行修改,并用作返回值。

最初,可以修改由按值传递的变量所引用的对象可能并不明显。 由于只有对象引用按值传递,因此您可以这样做。 当您对由对象引用所引用的对象的成员进行更改时,这些更改将应用于实际的类实例。

不能使用结构在状态对象内部返回值。 由于结构属于值类型,异步进程所做的更改不会更改原结构的成员。 如果不需要返回值,可以使用结构来提供参数。

请参见

任务

如何:使用线程池(C# 和 Visual Basic)

参考

线程同步(C# 和 Visual Basic)

QueueUserWorkItem

System.Threading

ThreadPool

概念

多线程应用程序(C# 和 Visual Basic)

其他资源

线程处理(C# 和 Visual Basic)

HOW TO: Submit a Work Item to the Thread Pool by Using Visual C#(如何:使用 Visual C# 向线程池提交工作项)