导出 (0) 打印
全部展开
此文章由人工翻译。 将光标移到文章的句子上,以查看原文。
译文
原文

SemaphoreSlim 类

对可同时访问资源或资源池的线程数加以限制的 Semaphore 的轻量替代。

System.Object
  System.Threading.SemaphoreSlim

命名空间:  System.Threading
程序集:  mscorlib(在 mscorlib.dll 中)

[ComVisibleAttribute(false)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public class SemaphoreSlim : IDisposable

SemaphoreSlim 类型公开以下成员。

  名称说明
公共方法SemaphoreSlim(Int32)初始化 SemaphoreSlim 类的新实例,以指定可同时授予的请求的初始数量。
公共方法SemaphoreSlim(Int32, Int32)初始化 SemaphoreSlim 类的新实例,同时指定可同时授予的请求的初始数量和最大数量。
页首

  名称说明
公共属性AvailableWaitHandle返回一个可用于在信号量上等待的 WaitHandle
公共属性CurrentCount获取将允许进入 SemaphoreSlim 的线程的数量。
页首

  名称说明
公共方法Dispose()释放 SemaphoreSlim 类的当前实例所使用的所有资源。
受保护的方法Dispose(Boolean)在派生类中被重写时,释放由 ManualResetEventSlim 使用的非托管资源,也可以根据需要释放托管资源。
公共方法Equals(Object)确定指定的 Object 是否等于当前的 Object (继承自 Object。)
受保护的方法Finalize允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
公共方法GetHashCode用作特定类型的哈希函数。 (继承自 Object。)
公共方法GetType获取当前实例的 Type (继承自 Object。)
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (继承自 Object。)
公共方法Release()退出 SemaphoreSlim 一次。
公共方法Release(Int32)退出 SemaphoreSlim 指定次数。
公共方法ToString返回表示当前对象的字符串。 (继承自 Object。)
公共方法Wait()阻止当前线程,直至它可进入 SemaphoreSlim 为止。
公共方法Wait(CancellationToken)阻止当前线程,直至它可进入 SemaphoreSlim 为止,同时观察 CancellationToken
公共方法Wait(Int32)阻止当前线程,直至它可进入 SemaphoreSlim 为止,同时使用 32 位带符号整数来指定超时。
公共方法Wait(TimeSpan)阻止当前线程,直至它可进入 SemaphoreSlim 为止,同时使用 TimeSpan 来指定超时。
公共方法Wait(Int32, CancellationToken)阻止当前线程,直至它可进入 SemaphoreSlim 为止,并使用 32 位带符号整数来指定超时,同时观察 CancellationToken
公共方法Wait(TimeSpan, CancellationToken)阻止当前线程,直至它可进入 SemaphoreSlim 为止,并使用 TimeSpan 来指定超时,同时观察 CancellationToken
页首

SemaphoreSlim 提供不使用 Windows 内核信号量的轻型信号量类。

注意注意

应用到此类型或成员的 HostProtectionAttribute 特性具有以下 Resources 属性值:Synchronization | ExternalThreadingHostProtectionAttribute 不影响桌面应用程序(桌面应用程序一般通过双击图标、键入命令或在浏览器中输入 URL 启动)。有关更多信息,请参见 HostProtectionAttribute 类或 SQL Server 编程和宿主保护特性

下面的示例演示如何使用 SemaphoreSlim


using System;
using System.Threading;
using System.Threading.Tasks;

class SemaphoreSlimDemo
{
    // Demonstrates:
    //      SemaphoreSlim construction
    //      SemaphoreSlim.Wait()
    //      SemaphoreSlim.Release()
    //      SemaphoreSlim.AvailableWaitHandle
    static void Main()
    { 

        SemaphoreSlim ss = new SemaphoreSlim(2); // set initial count to 2
        Console.WriteLine("Constructed a SemaphoreSlim with an initial count of 2");

        Console.WriteLine("First non-blocking Wait: {0} (should be true)", ss.Wait(0));
        Console.WriteLine("Second non-blocking Wait: {0} (should be true)", ss.Wait(0));
        Console.WriteLine("Third non-blocking Wait: {0} (should be false)", ss.Wait(0));

        // Do a Release to free up a spot
        ss.Release();

        Console.WriteLine("Non-blocking Wait after Release: {0} (should be true)", ss.Wait(0));

        // Launch an asynchronous Task that releases the semaphore after 100 ms
        Task t1 = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(100);
            Console.WriteLine("Task about to release SemaphoreSlim");
            ss.Release();
        });

        // You can also wait on the SemaphoreSlim via the underlying Semaphore WaitHandle.
        // HOWEVER, unlike SemaphoreSlim.Wait(), it WILL NOT decrement the count.
        // In the printout below, you will see that CurrentCount is still 1
        ss.AvailableWaitHandle.WaitOne();
        Console.WriteLine("ss.AvailableWaitHandle.WaitOne() returned, ss.CurrentCount = {0}", ss.CurrentCount);

        // Now a real Wait(), which should return immediately and decrement the count.
        ss.Wait();
        Console.WriteLine("ss.CurrentCount after ss.Wait() = {0}", ss.CurrentCount);

        // Clean up
        t1.Wait();
        ss.Dispose();
    }
}


.NET Framework

受以下版本支持:4

.NET Framework Client Profile

受以下版本支持:4

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

SemaphoreSlim 的所有公共和受保护的成员是线程安全的,并且可以同时从多个线程使用,Dispose 除外,它只有当 SemaphoreSlim 上的所有其他操作都完成后才能使用。

社区附加资源

添加
显示:
© 2014 Microsoft