none
网站编译的过程中出现下面的错误 RRS feed

答案

  • 你好!
       这个异常是
    对计数已达到最大值的信号量调用 Semaphore..::.Release 方法时引发的异常
       信号量的计数在每次线程进入信号量时减小,在线程释放信号量时增加。当计数为零时,后面的请求将被阻塞,直到有其他线程释放信号量。当所有的线程都已释放信号量时,计数达到创建信号量时所指定的最大值。如果编程错误导致线程在此时调用 Semaphore..::.Release 方法,将引发 SemaphoreFullException
       SemaphoreFullException 不一定表示发生异常的代码有问题。比如下面这种情况:线程 A 和线程 B 进入一个最大计数值为 2 的信号量。线程 B 的编程错误导致其调用两次 Release,从而使该信号量的计数已满。因此,当线程 A 最终调用 ReleaseSemaphoreFullException。
       这个实例说明了这个异常是怎样发生的
    using System;
    using System.Threading;

    public class Example
    {
    // A semaphore that can satisfy at most two concurrent
    // requests.
    //
    private static Semaphore _pool = new Semaphore(2, 2);

    public static void Main()
    {
    // Create and start two threads, A and B.
    //
    Thread tA = new Thread(new ThreadStart(ThreadA));
    tA.Start();

    Thread tB = new Thread(new ThreadStart(ThreadB));
    tB.Start();
    }

    private static void ThreadA()
    {
    // Thread A enters the semaphore and simulates a task
    // that lasts a second.
    //
    _pool.WaitOne();
    Console.WriteLine("Thread A entered the semaphore.");

    Thread.Sleep(1000);

    try
    {
    _pool.Release();
    Console.WriteLine("Thread A released the semaphore.");
    }
    catch(Exception ex)
    {
    Console.WriteLine("Thread A: {0}", ex.Message);
    }
    }

    private static void ThreadB()
    {
    // Thread B simulates a task that lasts half a second,
    // then enters the semaphore.
    //
    Thread.Sleep(500);

    _pool.WaitOne();
    Console.WriteLine("Thread B entered the semaphore.");

    // Due to a programming error, Thread B releases the
    // semaphore twice. To fix the program, delete one line.
    _pool.Release();
    _pool.Release();
    Console.WriteLine("Thread B exits successfully.");
    }
    }
    /* This code example produces the following output:

    Thread A entered the semaphore.
    Thread B entered the semaphore.
    Thread B exits successfully.
    Thread A: Adding the given count to the semaphore would cause it to exceed its maximum count.
    */



            
    2008年11月4日 7:17
    版主

全部回复

  • 没有贴错误信息啊
    2008年10月31日 1:31
    版主
  • 你好!
       请将错误信息贴出来啊!
    2008年10月31日 2:44
    版主
  • 主题内容已修改

    2008年11月4日 6:27
  • 你好!
       这个异常是
    对计数已达到最大值的信号量调用 Semaphore..::.Release 方法时引发的异常
       信号量的计数在每次线程进入信号量时减小,在线程释放信号量时增加。当计数为零时,后面的请求将被阻塞,直到有其他线程释放信号量。当所有的线程都已释放信号量时,计数达到创建信号量时所指定的最大值。如果编程错误导致线程在此时调用 Semaphore..::.Release 方法,将引发 SemaphoreFullException
       SemaphoreFullException 不一定表示发生异常的代码有问题。比如下面这种情况:线程 A 和线程 B 进入一个最大计数值为 2 的信号量。线程 B 的编程错误导致其调用两次 Release,从而使该信号量的计数已满。因此,当线程 A 最终调用 ReleaseSemaphoreFullException。
       这个实例说明了这个异常是怎样发生的
    using System;
    using System.Threading;

    public class Example
    {
    // A semaphore that can satisfy at most two concurrent
    // requests.
    //
    private static Semaphore _pool = new Semaphore(2, 2);

    public static void Main()
    {
    // Create and start two threads, A and B.
    //
    Thread tA = new Thread(new ThreadStart(ThreadA));
    tA.Start();

    Thread tB = new Thread(new ThreadStart(ThreadB));
    tB.Start();
    }

    private static void ThreadA()
    {
    // Thread A enters the semaphore and simulates a task
    // that lasts a second.
    //
    _pool.WaitOne();
    Console.WriteLine("Thread A entered the semaphore.");

    Thread.Sleep(1000);

    try
    {
    _pool.Release();
    Console.WriteLine("Thread A released the semaphore.");
    }
    catch(Exception ex)
    {
    Console.WriteLine("Thread A: {0}", ex.Message);
    }
    }

    private static void ThreadB()
    {
    // Thread B simulates a task that lasts half a second,
    // then enters the semaphore.
    //
    Thread.Sleep(500);

    _pool.WaitOne();
    Console.WriteLine("Thread B entered the semaphore.");

    // Due to a programming error, Thread B releases the
    // semaphore twice. To fix the program, delete one line.
    _pool.Release();
    _pool.Release();
    Console.WriteLine("Thread B exits successfully.");
    }
    }
    /* This code example produces the following output:

    Thread A entered the semaphore.
    Thread B entered the semaphore.
    Thread B exits successfully.
    Thread A: Adding the given count to the semaphore would cause it to exceed its maximum count.
    */



            
    2008年11月4日 7:17
    版主