-1

我有这个过程,其中有两个线程。和一个带有按钮(开始、暂停、暂停、恢复)的表单。每当我暂停使用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;


        }
4

1 回答 1

2

直接暂停线程基本上是一个冒险的提议 - 从另一个线程,您无法判断“目标”线程何时处于关键事件的中间。例如,您不想挂起一个线程,而它拥有一个您想从另一个线程获取的锁。

ManualResetEvent您当然可以使用等待句柄 -在这种情况下我建议。控制线程将调用Set为其他线程开绿灯,并Reset“要求”它们暂停。然后其他线程将WaitOne定期调用(通常作为循环的第一部分),在未设置事件时阻塞。

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

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

鉴于您似乎每秒做一次工作,另一种选择 - 可能更简单的方法是在一个计时器中完成所有工作,您只需适当地启用和禁用该计时器。

于 2013-01-13T09:25:47.013 回答