Главный вопрос: как усыпить все потоки, работающие в программе, кроме текущего/основного?
У меня есть программа с использованием подключения к MS SQL Server через EF, проблема в том, что иногда, когда программа работает, она зависает, когда мы переводим компьютер в спящий режим и просыпаемся, проблема, похоже, связана с подключением к БД. Программа может попытаться получить некоторые данные из БД, когда соединение еще не восстановлено. Идея заключалась в том, чтобы обнаружить событие PowerModeChanged
, и когда мы обнаружим режим Suspend
, все потоки, кроме текущего, должны быть переведены в спящий режим до следующего события Resume
. Я не знаю, как усыпить или программно приостановить работу разных потоков, отличных от текущего. Я нашел это:
ProcessThreadCollection currentThreads = Process.GetCurrentProcess().Threads;
но я не нахожу правильного способа разыграть его или найти их по идентификатору и не смогу их усыпить.
Есть какой-либо способ сделать это?
P.S. Еще немного кода ниже (функция 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
}
}
}
}
Resume
не произойдет до восстановления соединения? - person bornfromanegg   schedule 28.11.2017