主要问题是:除了当前/主线程之外,如何使程序中运行的所有线程休眠?
我有通过 EF 使用连接到 MS SQL Server 的程序,问题是有时当程序运行时,当我们将计算机置于睡眠模式并唤醒时它会崩溃,问题似乎是与 DB 的连接。当连接尚未恢复时,程序可能会尝试从数据库中获取一些数据。想法是检测事件,PowerModeChanged
当我们检测到Suspend
模式时,除当前之外的所有线程都应该进入睡眠状态,直到下一个事件Resume
。我不知道如何让与当前线程不同的线程进入睡眠状态或以编程方式保持工作。我找到了这个:
ProcessThreadCollection currentThreads = Process.GetCurrentProcess().Threads;
但我没有找到正确的施法方法,或者通过 ID 找到它们,并且能够让它们入睡。
有没有办法做到这一点?
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
}
}
}
}