我有这个过程,里面有两个线程。和一个有按钮的表单(开始,暂停,暂停,恢复)。每当我暂停使用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;
}
答案 0 :(得分:2)
直接挂起线程基本上是一个冒险的命题 - 从另一个线程,你无法判断“目标”线程何时处于关键的中间位置。例如,您不希望在拥有您想要从另一个线程获取的锁定时挂起该线程。
你当然可以使用等待句柄 - 在这种情况下我建议使用ManualResetEvent
。 控制线程会调用Set
向其他线程发出绿灯,Reset
“要求”它们暂停。其他线程将定期调用WaitOne
(通常作为循环的第一部分),在未设置事件时阻塞。
您可能希望在等待通话中设置超时,以便您可以定期检查其他事情的状态(例如是否完全退出) - 这取决于您的情况。使用WaitOne
的返回值来确定事件是否实际发出信号,或者您是否刚刚超时。
另一种替代方法是使用Monitor.Pulse
/ Monitor.PulseAll
/ Monitor.Wait
来指示状态更改,并保留一个单独的标志,说明线程是否应该正常工作。你需要小心内存模型,检查你的线程是否看到彼此写的更改。
鉴于您似乎每秒钟工作一次,另一种选择 - 可能更简单的是在计时器中执行 all 工作,您只需适当地启用和禁用它。