0

主要问题是:除了当前/主线程之外,如何使程序中运行的所有线程休眠?

我有通过 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
                    }
                }
            }
        }
4

1 回答 1

2

我认为这是错误的做法。您的线程本身应该对这些系统事件做出反应并采取相应的行动。

从另一个线程暂停和恢复它们是危险的。您绝对无法控制这些线程当前正在执行的代码,或者当它们再次恢复时这些代码是否仍能正常工作。

这就是为什么Thread.Suspend()andThread.Resume()已被弃用且不应再使用的原因之一。


更改您的工作线程,以便它们自己检测电源事件并采取相应措施:进入定义的状态并在恢复电源时重新开始工作。或者终止并稍后完全重新启动。

于 2017-11-28T14:26:40.977 回答