要查看英语原文,请勾选“英语”复选框。也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语
本文档已存档,并且将不进行维护。

Semaphore.Release 方法 (Int32)

以指定的次数退出信号量并返回前一个计数。

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

public int Release(
	int releaseCount
)

参数

releaseCount
类型:System.Int32
退出信号量的次数。

返回值

类型:System.Int32
调用 Release 方法前信号量的计数。

异常条件
ArgumentOutOfRangeException

releaseCount 小于 1。

SemaphoreFullException

信号量计数已是最大值。

IOException

发生已命名信号量的 Win32 错误。

UnauthorizedAccessException

当前信号量表示一个已命名的系统信号量,但用户不具备 SemaphoreRights.Modify 权限。

- 或 -

当前信号量表示一个已命名的系统信号量,但它不是以 SemaphoreRights.Modify 权限打开的。

如果线程多次进入信号量,此方法重载允许通过一个调用还原整个信号量计数。

如果 Release 方法引发了 SemaphoreFullException,不一定表示调用线程有问题。 另一个线程中的编程错误可能导致该线程退出信号量的次数超过它进入的次数。

如果当前 Semaphore 对象表示已命名的系统信号量,则用户必须具有 SemaphoreRights.Modify 权限而且信号量必须已用 SemaphoreRights.Modify 权限打开。

下面的代码示例创建一个最大计数为 3、初始计数为 0 的信号量。 此示例启动五个线程,这些线程都将阻止等待该信号量。 主线程使用 Release(Int32) 方法重载,以便将信号量计数增加为其最大值,从而允许三个线程进入该信号量。 每个线程都使用 Thread.Sleep 方法等待一秒钟以便模拟工作,然后调用 Release() 方法重载以释放信号量。

每次释放信号量时,都显示前一个信号量计数。 控制台消息对信号量的使用进行跟踪。 每个线程的模拟工作间隔都稍有增加,以使输出更为易读。


using System;
using System.Threading;

public class Example
{
    // A semaphore that simulates a limited resource pool.
    //
    private static Semaphore _pool;

    // A padding interval to make the output more orderly.
    private static int _padding;

    public static void Main()
    {
        // Create a semaphore that can satisfy up to three
        // concurrent requests. Use an initial count of zero,
        // so that the entire semaphore count is initially
        // owned by the main program thread.
        //
        _pool = new Semaphore(0, 3);

        // Create and start five numbered threads. 
        //
        for(int i = 1; i <= 5; i++)
        {
            Thread t = new Thread(new ParameterizedThreadStart(Worker));

            // Start the thread, passing the number.
            //
            t.Start(i);
        }

        // Wait for half a second, to allow all the
        // threads to start and to block on the semaphore.
        //
        Thread.Sleep(500);

        // The main thread starts out holding the entire
        // semaphore count. Calling Release(3) brings the 
        // semaphore count back to its maximum value, and
        // allows the waiting threads to enter the semaphore,
        // up to three at a time.
        //
        Console.WriteLine("Main thread calls Release(3).");
        _pool.Release(3);

        Console.WriteLine("Main thread exits.");
    }

    private static void Worker(object num)
    {
        // Each worker thread begins by requesting the
        // semaphore.
        Console.WriteLine("Thread {0} begins " +
            "and waits for the semaphore.", num);
        _pool.WaitOne();

        // A padding interval to make the output more orderly.
        int padding = Interlocked.Add(ref _padding, 100);

        Console.WriteLine("Thread {0} enters the semaphore.", num);

        // The thread's "work" consists of sleeping for 
        // about a second. Each thread "works" a little 
        // longer, just to make the output more orderly.
        //
        Thread.Sleep(1000 + padding);

        Console.WriteLine("Thread {0} releases the semaphore.", num);
        Console.WriteLine("Thread {0} previous semaphore count: {1}",
            num, _pool.Release());
    }
}


.NET Framework

受以下版本支持:4、3.5、3.0、2.0

.NET Framework Client Profile

受以下版本支持:4、3.5 SP1

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

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