导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

ThreadPool 类

2013/12/13

提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

System.Object
  System.Threading.ThreadPool

Namespace:  System.Threading
程序集:  mscorlib(位于 mscorlib.dll 中)

声明
Public NotInheritable Class ThreadPool

ThreadPool 类型公开以下成员。

  名称说明
公共方法静态成员GetMaxThreads检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。
公共方法静态成员GetMinThreads检索线程池在新请求预测中维护的空闲线程数。
公共方法静态成员QueueUserWorkItem(WaitCallback)将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
公共方法静态成员QueueUserWorkItem(WaitCallback, Object)将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
公共方法静态成员RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)注册一个等待 WaitHandle 的委托,并指定一个 32 位有符号整数来表示超时值(以毫秒为单位)。
公共方法静态成员RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)注册一个等待 WaitHandle 的委托,并指定一个 64 位有符号整数来表示超时值(以毫秒为单位)。
公共方法静态成员RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)注册一个等待 WaitHandle 的委托,并指定一个 TimeSpan 值来表示超时时间。
公共方法静态成员RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)指定表示超时(以毫秒为单位)的 32 位无符号整数,注册一个委托等待 WaitHandle
公共方法静态成员SetMaxThreads安全非常关键。 设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。
公共方法静态成员SetMinThreads安全非常关键。 设置线程池在新请求预测中维护的空闲线程数。
返回顶部

线程池通过为应用程序提供一个由系统管理的辅助线程池,使您可以更为有效地使用线程。一个线程监视排到线程池的若干个等待操作的状态。当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数。

说明注意:

如果需要从由线程池中的线程执行的代码访问用户界面元素,请使用 System.Windows.Threading.Dispatcher 类在用户界面线程上运行您的代码。

托管线程池中的线程为后台线程,即它们的 IsBackground 属性为 true

也可以排列与等待操作不相关的工作项。若要请求由线程池中的一个线程来处理工作项,请调用 QueueUserWorkItem 方法。此方法将对将被从线程池中选定的线程调用的方法或委托的引用用作参数。一个工作项排入队列后就无法再取消它。

计时器队列中的计时器以及已注册的等待操作也使用线程池。它们的回调函数也会排列到线程池。

每个进程都有一个线程池。线程池的默认大小为:每个处理器 250 个辅助线程,再加上 1000 个 I/O 完成线程。

线程池维护尽可能少的空闲线程。对于辅助线程,此最小数目的默认值为处理器的数目。GetMinThreads 方法可获取空闲的辅助线程和 I/O 完成线程的最小数目。

在所有线程池线程都分配到任务后,线程池不会立即开始创建新的空闲线程。为避免向线程分配不必要的堆栈空间,线程池按照一定的时间间隔创建新的空闲线程。该时间间隔目前为半秒,但它在 .NET Framework 的以后版本中可能会更改。

如果线程池重用某个线程,它不会清除线程本地存储区或由 ThreadStaticAttribute 特性标记的字段中的数据。因此,由一种方法放入线程本地存储区中的数据可以向由同一个线程池线程执行的其他任何方法公开。用于访问由 ThreadStaticAttribute 特性标记的字段的方法可能会遇到不同的数据,具体取决于执行此方法的线程池线程。

TopicLocation
如何:创建异步 HTTP 处理程序在 Visual Studio 中生成 ASP .NET Web 应用程序
如何:创建异步 HTTP 处理程序在 Visual Studio 中生成 ASP .NET Web 应用程序
如何:创建异步 HTTP 处理程序生成 ASP .NET Web 应用程序

下面的示例使用 QueueUserWorkItem(WaitCallback) 方法重载将任务排入队列,由 ThreadProc 方法表示,以便在线程可用时执行。此重载并不提供任何任务信息。因此,可供 ThreadProc 方法使用的信息仅限此方法所属的对象。

该示例在 UI 线程上的 TextBlock 中显示其输出。为了从回调线程访问 TextBlock,该示例使用 Dispatcher 属性来获取 TextBlockDispatcher 对象,然后使用 Dispatcher.BeginInvoke 方法进行跨线程调用。

说明注意:

要运行此示例,请参见生成具有静态 Windows Phone TextBlock 控件的示例


Imports System.Threading

Class Example

    ' This is the UI element that receives the output from the example.
    Private Shared outputBlock As System.Windows.Controls.TextBlock

    ' The Demo method runs the example. It saves the TextBlock that is 
    ' used for output, and sets up an event handler to start tasks.
    Public Shared Sub Demo(ByVal outputBlock As System.Windows.Controls.TextBlock)

        Example.outputBlock = outputBlock
        outputBlock.Text = "Click here to start a background task." & vbCrLf

        ' Set up an event handler to start a task when the TextBlock 
        ' is clicked.
        AddHandler outputBlock.MouseLeftButtonUp, AddressOf HandleMouseUp

    End Sub

    ' Clicking the TextBlock queues a delegate to perform a task on a 
    ' thread pool thread.
    Private Shared Sub HandleMouseUp(ByVal sender As Object, _
                          ByVal e As System.Windows.Input.MouseButtonEventArgs) 

        ThreadPool.QueueUserWorkItem(AddressOf AppendTextTask)

        ' Note: The stateInfo object for the task in this example is
        ' Nothing, because this overload of QueueUserWorkItem does not
        ' take a stateInfo parameter. 
    End Sub 

    ' This method performs the task, which is to append text to the
    ' TextBlock. To communicate with objects on the UI thread, get the 
    ' Dispatcher for one of the UI objects. Use the Dispatcher object's 
    ' BeginInvoke method to queue a delegate that will run on the UI thread,
    ' and therefore can safely access UI elements like the TextBlock. In 
    ' this example, the delegate is stored in the field named 'append'.
    Private Shared Sub AppendTextTask(ByVal stateInfo As Object)

        outputBlock.Dispatcher.BeginInvoke(append, "Hello from the thread pool." & vbCrLf)

    End Sub

    ' Invoking this delegate runs the AppendText method.
    Private Shared append As New Action(Of String)(AddressOf AppendText) 

    ' The AppendText method can safely access UI elements because it is run
    ' on the UI thread, by using the Dispatcher.BeginInvoke method.
    Private Shared Sub AppendText(ByVal text As String) 

        outputBlock.Text &= text

    End Sub
End Class 

' This code produces output similar to the following:
'
'Click here to start a background task.
'Hello from the thread pool.
'Hello from the thread pool.
'Hello from the thread pool.


Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

此类型是线程安全的。

显示:
© 2014 Microsoft