Спите все потоки в программе, кроме текущего / основного в C#

Главный вопрос: как усыпить все потоки, работающие в программе, кроме текущей / основной?

У меня есть программа с использованием подключения к MS SQL Server через EF, проблема в том, что иногда, когда программа запускается, она падает, когда мы переводим компьютер в спящий режим и просыпаемся, проблема, кажется, связана с БД. Программа может попытаться получить некоторые данные из БД, когда соединение еще не восстановлено. Идея заключалась в том, чтобы обнаружить событие PowerModeChanged и когда мы обнаружим Suspend В режиме все потоки, кроме текущего, должны быть переведены в спящий режим до следующего события Resume, Я не знаю, как уложить спать или программно провести работу потоков, отличных от текущих. Я нашел это:

ProcessThreadCollection currentThreads = Process.GetCurrentProcess().Threads;

но я не нахожу правильного способа разыграть его или найти по идентификатору и уложить в сон.

Есть какой-либо способ сделать это?

PS Еще немного кода ниже (функция SystemEvents_PowerModeChanged, еще не завершена):

[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
public static extern Int32 GetCurrentWin32ThreadId();
        private void SystemEvents_PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs e)
        {
            if (e.Mode == PowerModes.Suspend)
            {
               ProcessThreadCollection currentThreads = Process.GetCurrentProcess().Threads;

                int currentThreadId = GetCurrentWin32ThreadId();
                Console.WriteLine("CURRENT thread: " + currentThreadId);

                foreach (ProcessThread thread in currentThreads)
                {
                    if (thread.Id != currentThreadId)
                    {
                        Console.WriteLine("Disable thread: " + thread.Id);
                        // Disable threads
                    }
                }
            }
            else if (e.Mode == PowerModes.Resume)
            {
                ProcessThreadCollection currentThreads = Process.GetCurrentProcess().Threads;
                int currentThreadId = GetCurrentWin32ThreadId();
                Console.WriteLine("CURRENT thread: " + currentThreadId);
                foreach (ProcessThread thread in currentThreads)
                {
                    if (thread.Id != currentThreadId)
                    {
                        Console.WriteLine("Enable thread: " + thread.Id);
                        // Enable threads
                    }
                }
            }
        }

1 ответ

Я думаю, что это неправильный подход. Сами ваши потоки должны реагировать на эти системные события и действовать соответственно.

Приостановить и возобновить их из другого потока опасно. Вы абсолютно не можете контролировать код, выполняемый этими потоками, или же он будет работать правильно, когда они возобновятся.

Это одна из причин, почему Thread.Suspend() а также Thread.Resume() устарели и больше не должны использоваться.


Измените ваши рабочие потоки так, чтобы они сами определяли события питания и могли действовать соответствующим образом: перейдите в определенное состояние и начните работу снова, когда питание возобновится. Или прекратить и получить полностью перезапустить позже.

Другие вопросы по тегам