-1

このプロセスには2つのスレッドがあります。ボタン (開始、一時停止、一時停止、再開) を持つフォーム。アプリケーション全体を使用して一時停止するたびに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他のスレッドは定期的に (通常はループの最初の部分として)呼び出し、イベントが設定されていない場合はブロックします。

他のことの状態 (例えば、完全に終了するかどうか) を定期的に確認できるように、wait 呼び出しにタイムアウトを設定することをお勧めします。これは状況によって異なります。の戻り値を使用してWaitOne、イベントが実際に通知されたかどうか、または単にタイムアウトになったかどうかを調べます。

別の方法として、Monitor.Pulse/ Monitor.PulseAll/を使用Monitor.Waitして状態の変化を示し、スレッドが機能するかどうかを示す別のフラグを保持することもできます。ただし、スレッドが相互に書き込まれた変更を認識していることを確認するには、メモリ モデルに注意する必要があります。

1 秒に 1 回作業を行っているように見える場合、さらに別の方法として、適切に有効化および無効化するだけのタイマーですべての作業を行う方が簡単かもしれません。

于 2013-01-13T09:25:47.013 に答える