.NET Mutex вызывает голодание потока GUI в Windows Forms - PullRequest
0 голосов
/ 22 мая 2018

Приложение 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();
}

Почему это так?

...