如何使用EventWaitHandler挂起某些线程



我有一个包含两个线程的进程。还有一个带有按钮(开始、暂停、暂停、恢复)的表单。当我暂停使用EWH.WaitOne()时,整个应用程序冻结(暂停),我不能再按恢复按钮

是否有一种方法可以暂停2个线程,而表单继续运行?(线程1和线程2在我的代码)

 public partial class Form1 : Form
    {
        public static System.Timers.Timer timer;
        static Thread Thread1;
        static Thread Thread2;
        private static EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset);

        static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            using (var writer = File.AppendText("WriteTo.txt"))
            {
                writer.AutoFlush = true;
                writer.WriteLine(e.SignalTime);
            }

        }
        static void method1()
        {
            string text = "";
            using (FileStream fs = File.Open("C:\Users\Wissam\Documents\Visual Studio 2010\Projects\Proc1\Proc1\bin\Debug\MyFile.txt", FileMode.Open, FileAccess.Read, FileShare.None))
            {
                int length = (int)fs.Length;
                byte[] b = new byte[length];
                UTF8Encoding temp = new UTF8Encoding(true);
                while (fs.Read(b, 0, b.Length) > 0)
                {
                    text += temp.GetString(b);
                }
                using (FileStream fs1 = File.Open("C:\Users\Wissam\Documents\Visual Studio 2010\Projects\Proc1\Proc1\bin\Debug\MyFile1.txt", FileMode.Open, FileAccess.Write, FileShare.None))
                {
                    fs1.Write(temp.GetBytes(text), 0, temp.GetByteCount(text));
                    Thread.Sleep(1000);
                }
            }
        }
        static void method2()
        {
            timer = new System.Timers.Timer(1000);
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Interval = 1000;
            timer.Enabled = true;

        }

直接挂起线程基本上是一个有风险的命题——从另一个线程,您无法判断"目标"线程何时处于关键的过程中。例如,当一个线程拥有一个锁时,你不想挂起它,因为你想从另一个线程获得这个锁。

你当然可以使用等待句柄——在这种情况下我建议使用ManualResetEvent。控制线程的调用Set为其他线程开绿灯,调用Reset"请求"其他线程挂起。然后,其他线程将定期调用WaitOne(通常作为循环的第一部分),当事件未设置时阻塞。

你可能很想在等待调用上设置一个超时,这样你就可以定期检查其他事情的状态(例如是否完全退出)——这取决于你的情况。使用WaitOne的返回值来确定事件是否实际发出了信号,或者是否只是超时了。

另一种选择是使用Monitor.Pulse/Monitor.PulseAll/Monitor.Wait来指示状态变化,并保留一个单独的标志来表示线程是否应该工作。但是,您需要小心内存模型,以检查线程是否看到彼此写入的更改。

考虑到你似乎每秒做一次工作,另一种可能更简单的选择是在一个计时器中完成所有工作,你只需适当地启用和禁用

相关内容

  • 没有找到相关文章

最新更新