Шон, звучит так, будто другие не решают твою актуальную проблему. Похоже, вы представляете большую проблему в простом решении. В любом случае, блокировка не будет работать в том же потоке. Он предназначен для блокировки других потоков. Если в том же потоке обнаружена блокировка, он просто увеличивает счетчик ссылок или что-то в этом роде и позволяет входу блокировать только другие потоки, пока счетчик ссылок не станет равным нулю.
Итак, изначально я думал, что Mutex, Semaphore, SpinWait, SpinUntil помогут, но в то время как они будут в конечном итоге блокировать удовлетворение вашей потребности предотвратить вход, однако ваше приложение будет затем заблокировано и ожидает, потому что вы находитесь в потоке пользовательского интерфейса так что вы даже не сможете закрыть Form2 (или что-то еще, с чем вы работаете).
Если честно, я не знаю, как правильно решить проблему. Я бы подумал, что для этого есть шаблон или встроенная функциональность, но я не знаю об этом. Однако, если вы можете создать другой поток, который может решить вашу проблему, как показано в приведенном ниже коде.
public partial class Form1 : Form
{
Timer _timer = new Timer();
private readonly static object _lock = new object();
public Form1()
{
InitializeComponent();
_timer.Tick += delegate { OnTimerTick(); };
_timer.Interval = 5000;
_timer.Start();
}
private void OnTimerTick()
{
new System.Threading.Thread (DoSomething).Start();
}
private void DoSomething()
{
Console.WriteLine("Before Lock");
lock(_lock)
{
// Do stuff...
Form2 form2 = new Form2();
form2.ShowDialog();
}
Console.WriteLine("After Lock");
}
}
Удачи. Если это помогло, не забудьте проголосовать за этот ответ.
Спасибо,
Том