在C#

时间:2017-11-28 14:08:53

标签: c# multithreading sleep systemevent

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

我有通过EF使用连接到MS SQL Server的程序,问题是当程序运行时,当我们将计算机置于睡眠模式并唤醒时崩溃,问题似乎是与DB的连接。当连接尚未恢复时,程序可能会尝试从DB获取一些数据。想法是检测PowerModeChanged的事件,当我们检测到Suspend模式时,除了当前的所有线程都应该进入休眠状态直到下一个事件Resume。 我不知道如何进入睡眠或以编程方式保存不同线程的工作而不是当前的工作。 我发现了这个:

ProcessThreadCollection currentThreads = Process.GetCurrentProcess().Threads;

但是我没有找到正确的方法来投射它,或者通过Id找到它们,并且能够让它们进入睡眠状态。

有没有办法做到这一点?

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
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:2)

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

暂停并从其他主题恢复它们危险。你绝对无法控制这些线程当前正在执行的代码,或者当它们再次恢复时仍能正常工作。

这是Thread.Suspend()Thread.Resume()被弃用且不应再使用的原因之一。

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