Приложение WinForm имеет 20 потоков, работающих в фоновом режиме, каждый из которых ожидает мьютекса.При получении сигнала он выполняет «работу», как в Thread.Sleep, в течение примерно 100 мс и освобождает ее.Затем ждет 1 секунду и снова выполняет задание.
private Mutex locker;
private void NewThread()
{
Thread thread = new Thread(ThreadLoopMutex);
thread.Priority = ThreadPriority.BelowNormal;
thread.Name = threadCounter++.ToString("D2");
thread.Start();
}
private void ThreadLoopMutex()
{
PrintLog("was created");
while (true)
{
PrintLog("Lock1");
locker.WaitOne();
Thread.Sleep(100);
PrintLog("UnLock1");
locker.ReleaseMutex();
Thread.Sleep(1000);
PrintLog("Lock2");
locker.WaitOne();
Thread.Sleep(100);
PrintLog("UnLock2");
locker.ReleaseMutex();
}
}
public Form1()
{
InitializeComponent();
locker = new Mutex();
Thread.CurrentThread.Name = "GUI";
Thread.CurrentThread.Priority = ThreadPriority.Highest;
for (int i = 0; i < 20; i++)
{
NewThread();
}
}
Когда поток GUI пытается ожидать того же мьютекса, он никогда не сигнализирует.Он будет ждать на Mutex долгое время, пока другие потоки играют с ним гладко.Когда я устанавливаю время работы 20 потоков на 30 мс, а не на 100 мс, поток GUI свободно входит в мьютекс.
private void button1_Click(object sender, EventArgs e)
{
PrintLog("Lock");
locker.WaitOne();
Thread.Sleep(500);
PrintLog("UnLock");
locker.ReleaseMutex();
}
Почему это так?