Спите все потоки в программе, кроме текущего / основного в 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()
устарели и больше не должны использоваться.
Измените ваши рабочие потоки так, чтобы они сами определяли события питания и могли действовать соответствующим образом: перейдите в определенное состояние и начните работу снова, когда питание возобновится. Или прекратить и получить полностью перезапустить позже.