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

Semaphore 类

2013/12/13

限制可同时访问某一资源或资源池的线程数。

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

声明
Public NotInheritable Class Semaphore _
	Inherits WaitHandle

Semaphore 类型公开以下成员。

  名称说明
公共方法Semaphore(Int32, Int32)初始化 Semaphore 类的新实例,并指定最大并发入口数,还可以选择保留某些入口。
公共方法Semaphore(Int32, Int32, String)安全非常关键。 初始化 Semaphore 类的新实例,并指定最大并发入口数,还可以选择为调用线程保留某些入口,以及选择指定系统信号量对象的名称。
公共方法Semaphore(Int32, Int32, String, Boolean)安全非常关键。 初始化 Semaphore 类的新实例,并指定最大并发入口数,还可以选择为调用线程保留某些入口,选择指定系统信号量对象的名称,以及指定一个变量来接收指示是否创建了新系统信号量的值。
返回顶部

  名称说明
公共属性SafeWaitHandle获取或设置本机操作系统句柄。 (从 WaitHandle 继承。)
返回顶部

  名称说明
公共方法Close在派生类中被重写时,释放由当前 WaitHandle 持有的所有资源。 (从 WaitHandle 继承。)
公共方法Dispose释放由 WaitHandle 类的当前实例使用的所有资源。 (从 WaitHandle 继承。)
受保护的方法Dispose(Boolean)在派生类中被重写时,释放由 WaitHandle 使用的非托管资源,也可以根据需要释放托管资源。 (从 WaitHandle 继承。)
公共方法Equals(Object)确定指定的 Object 是否等于当前的 Object (从 Object 继承。)
受保护的方法Finalize允许 Object 在垃圾回收器回收该对象之前尝试释放资源并执行其他清理操作。 (从 Object 继承。)
公共方法GetHashCode用作特定类型的哈希函数。 (从 Object 继承。)
公共方法GetType获取当前实例的 Type (从 Object 继承。)
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (从 Object 继承。)
公共方法静态成员OpenExisting安全非常关键。 打开指定的已命名信号量,如果它已经存在。
公共方法Release退出信号量并返回前一个计数。
公共方法Release(Int32)以指定的次数退出信号量并返回前一个计数。
公共方法ToString返回一个字符串,它表示当前的对象。 (从 Object 继承。)
公共方法静态成员TryOpenExisting安全非常关键。 打开指定的已命名信号量(如果它已经存在),并且返回一个值,指示操作是否成功。
公共方法WaitOne阻止当前线程,直到当前 WaitHandle 收到信号。 (从 WaitHandle 继承。)
公共方法WaitOne(Int32)阻止当前线程,直到当前 WaitHandle 收到信号,同时使用 32 位有符号整数指定时间间隔。 (从 WaitHandle 继承。)
公共方法WaitOne(TimeSpan)阻止当前线程,直到当前实例收到信号,同时使用 TimeSpan 指定时间间隔。 (从 WaitHandle 继承。)
返回顶部

使用 Semaphore 类可控制对资源池的访问。线程通过调用 WaitOne 方法(从 WaitHandle 类继承)进入信号量,并通过调用 Release 方法释放信号量。

信号量的计数在每次线程进入信号量时减小,在线程释放信号量时增加。当计数为零时,后面的请求将被阻塞,直到有其他线程释放信号量。当所有的线程都已释放信号量时,计数达到创建信号量时所指定的最大值。

被阻止的线程并不一定按特定的顺序(如 FIFO 或 LIFO)进入信号量。

线程可通过重复调用 WaitOne 方法多次进入信号量。为释放这些入口中的部分或全部,线程可多次调用无参数的 Release 方法重载,也可以调用 Release(Int32) 方法重载来指定要释放的入口数。

Semaphore 类不对 WaitOneRelease 调用强制线程标识。程序员负责确保线程释放信号量的次数不能太多。例如,假定信号量的最大计数为 2,并且线程 A 和线程 B 同时进入信号量。如果线程 B 中的编程错误导致它两次调用 Release,则两次调用都成功。这样,信号量的计数已满,当线程 A 最终调用 Release 时便会引发 SemaphoreFullException

信号量分为两种类型:局部信号量和已命名的系统信号量。如果您使用接受名称的构造函数创建 Semaphore 对象,则该对象与具有该名称的操作系统信号量关联。已命名的系统信号量在整个操作系统中都可见,可用于同步进程活动。您可以创建多个 Semaphore 对象来表示同一个已命名的系统信号量,也可以使用 OpenExisting 方法打开现有的已命名系统信号量。

局部信号量仅存在于您的进程内。您的进程中任何引用局部 Semaphore 对象的线程都可以使用它。每个 Semaphore 对象都是一个单独的局部信号量。

下面的代码示例创建一个最大计数为 3、初始计数为 0 的信号量。此示例启动五个线程,这些线程都将阻止等待该信号量。主线程使用 Release(Int32) 方法重载,以便将信号量计数增加为其最大值,从而允许三个线程进入该信号量。每个线程都使用 Thread.Sleep 方法等待一秒钟以便模拟工作,然后调用 Release 方法重载以释放信号量。每次释放信号量时,都显示前一个信号量计数。控制台消息对信号量的使用进行跟踪。每个线程的模拟工作间隔都稍有增加,以使输出更为易读。

Windows Phone OS

受以下版本支持: 8.0

此类型是线程安全的。

显示:
© 2014 Microsoft