先说是一下 ManualResetEvent 是一线程用来控制别一个线程的信号。大家可以把它看成 操作系统原理中说到的pv操作
如下图所说是 ManualResetEvent 对象起一个信使的作用。
ManualResetEvent 对象的两个控制方法。
1、this.manualEvent.Reset(); //将事件状态设置为非终止状态,导致线程阻止。
2、this.manualEvent.Set(); //将事件状态设置为终止状态,允许一个或多个等待线程继续。
说了这么多光说不做还真没有用,接下来看代码!
class MyThread
{
Thread t = null;
ManualResetEvent manualEvent = new ManualResetEvent(true);//为trur,一开始就可以执行
private void Run()
{
while (true)
{
this.manualEvent.WaitOne();
Console.WriteLine("这里是 {0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
}
}
public void Start()
{
this.manualEvent.Set();
}
public void Stop()
{
this.manualEvent.Reset();
}
public MyThread()
{
t = new Thread(this.Run);
t.Start();
}
}
在 main 方法中要用到上面的类
static void Main(string[] args)
{
MyThread myt = new MyThread();
while (true)
{
Console.WriteLine("输入 stop后台线程挂起 start 开始执行!");
string str = Console.ReadLine();
if (str.ToLower().Trim() == "stop")
{
myt.Stop();
}
if (str.ToLower().Trim() == "start")
{
myt.Start();
}
}
}
原理就说完了我们来看一下程序运行的结果!
文章转载自C# ManualResetEvent 类的用法,感谢作者 蒋乐兴 提供好文章