Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用EventWaitHandler挂起某些线程_C#_Multithreading_Event Wait Handle - Fatal编程技术网

C# 如何使用EventWaitHandler挂起某些线程

C# 如何使用EventWaitHandler挂起某些线程,c#,multithreading,event-wait-handle,C#,Multithreading,Event Wait Handle,我有一个包含两个线程的进程。以及一个具有按钮(开始、暂停、暂停、恢复)的窗体。每当我暂停使用EWH.WaitOne()时,整个应用程序都会冻结(暂停),我再也不能按resume按钮了 是否有方法仅在窗体继续运行时挂起2个线程?(我的代码中的线程1和2) 直接挂起线程基本上是一个冒险的命题-从另一个线程,你不能知道什么时候“目标”线程是在关键的中间。例如,当某个线程拥有要从另一个线程获取的锁时,您不希望挂起该线程 您当然可以使用等待手柄-我建议在这种情况下使用。控制线程将调用以向其他线程发出绿灯,

我有一个包含两个线程的进程。以及一个具有按钮(开始、暂停、暂停、恢复)的窗体。每当我暂停使用
EWH.WaitOne()
时,整个应用程序都会冻结(暂停),我再也不能按resume按钮了

是否有方法仅在窗体继续运行时挂起2个线程?(我的代码中的线程1和2)


直接挂起线程基本上是一个冒险的命题-从另一个线程,你不能知道什么时候“目标”线程是在关键的中间。例如,当某个线程拥有要从另一个线程获取的锁时,您不希望挂起该线程

您当然可以使用等待手柄-我建议在这种情况下使用。控制线程将调用以向其他线程发出绿灯,并“请求”它们挂起。然后,其他线程将定期调用(通常作为循环的第一部分),在未设置事件时阻塞

您可能希望在等待通话中暂停,以便定期检查其他事情的状态(例如,是否完全退出)——这取决于您的情况。使用
WaitOne
的返回值来确定事件是否实际发出了信号,或者您是否刚刚超时

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


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

甚至创建其他线程的是什么?现在还不清楚你想在这里实现什么。我怀疑
WaitOne()
做不到您认为它能做的事情。我只需要使用几个线程,不用担心其他功能是的,我怀疑它可以。但是我需要类似于thread.suspend()的东西来停止对文件的写入您是否在UI线程中使用了
WaitOne()
?我强烈怀疑@JonSkeet是正确的,并且您正在从GUI线程调用事件WaitOne(),这肯定会填充表单响应。将事件等待放在线程方法的“while(fs.Read(b,0,b.Length)”循环中。另外,为什么要调用“Sleep(1000)”呢?
 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;


        }