Я хочу показать пример приложения семафоров для конкретной проблемы для моей домашней работы. Я добавил 3 кнопки в свою форму C#, и я хочу показать, что только одна кнопка в определенное время выполняет функцию банковского счета в моем коде. Когда я нажимаю три кнопки за две секунды, функция банковского счета должна запускаться только один раз. Поскольку у меня есть функция Thread.Sleep (6000) в течение 6 секунд, подождите в функции банковского счета. Но три моих клика работают на 6 секундных интервалов подряд. Как я могу изменить свой код для запуска только один раз, когда я нажимаю три кнопки последовательно. Кодекс:Простая реализация семафора с использованием приложения формы
имен semafor_form
{
public partial class Form1 : Form
{
Semaphore semafor=new Semaphore(1,1);
delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.textBox2.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox2.Text = text;
}
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void BankAccount()
{
semafor.WaitOne();
double a = Convert.ToDouble (textBox1.Text) + Convert.ToDouble (textBox2.Text);
Thread.Sleep(6000);
semafor.Release();
SetText(a.ToString());
}
private void btnATM_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(BankAccount));
t.Start();
}
private void btnCOUNTER_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(BankAccount));
t.Start();
}
private void btnINT_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(BankAccount));
t.Start();
}
}
}
Спасибо Джейсон, я сделал то, что вы сказали, но теперь функция банковского счета никогда не работает. Функция банковского счета должна запускаться один раз, даже если я нажимаю несколько раз в течение времени ожидания потока. – user2349578
Изменение на 'new Semaphore (0, 1)' сделает так, что нить не сможет получить семафор. –
Я попробовал «Semaphore semafor = new Semaphore (1,1)» с «if (semafor.WaitOne (0))», и все в порядке. Он работает, если семафор начинается с 1. – user2349578