參考 https://www.cnblogs.com/yifengjianbai/p/5468449.html
public partial class Semaphore1 : Form
{
private delegate void UpdateBox(object text);
UpdateBox UpText;
Semaphore Sema;
public Semaphore1()
{
InitializeComponent();
}
private void Semaphore1_Load(object sender, EventArgs e)
{
UpText = new UpdateBox(upRichText);
}
private void btnStart_Click(object sender, EventArgs e)
{
int ThreadNum = int.Parse(this.ThreadNum.Text);
int SemphoreNum = int.Parse(this.textBox1.Text);
Start(ThreadNum, SemphoreNum);
}
public void Start(int ThreadNum,int SemphoreNum)
{
Sema = new Semaphore(SemphoreNum, SemphoreNum);//初始化個數,最大個數,初始化個數限制線程數量
//Sema.WaitOne();
for (int i = 0; i < ThreadNum; i++)
{
Thread m_SplashThread = new Thread(new ParameterizedThreadStart(delegate(object OBJ) {
Run(OBJ);
}));
m_SplashThread.IsBackground = true;
m_SplashThread.SetApartmentState(ApartmentState.STA);
m_SplashThread.Start(i); //不要用new object[]這樣是個數組
}
}
private void Run(object obj)
{
Sema.WaitOne();//佔用一個線程
Bevoid("Start" + obj.ToString());
Thread.Sleep(2000);
Bevoid("End" + obj.ToString());
Sema.Release();//釋放一個線程,釋放超過最大數時,報錯
}
private void Bevoid(object obj)
{
this.BeginInvoke(UpText, obj);
}
private void upRichText(object text)
{
if (this.richTextBox1.Lines.Length > 100)
{
this.richTextBox1.Text="";
}
this.richTextBox1.AppendText(text.ToString());
this.richTextBox1.AppendText(Environment.NewLine);
}
private void button1_Click(object sender, EventArgs e)
{
Sema.Release();//釋放一個線程
}
private void button2_Click(object sender, EventArgs e)
{
Sema.WaitOne();//佔用一個線程,主線程會被阻塞
}
}