На самом деле в Silverlight нет семафора. Библиотека Threading для SL ограничена. Но вы можете сделать свой собственный очень легко. Вот пример:
public class Semaphore
{
private object Mutex { get; set; }
private int Count { get; set; }
private int Max { get; set; }
public Semaphore(int max = 1)
{
Mutex = new object();
Max = max;
}
public void WaitOne()
{
while (true)
{
lock (Mutex)
{
if (Count < Max)
{
Count++;
return;
}
}
Thread.Sleep(50);
}
}
public void Release()
{
lock (Mutex)
{
if (Count >= 0)
{
Count--;
}
}
}
}
Этот код основан на втором ответе этого поста , который предпочтительнее первого, так как фактически безопасен для потоков.