一、ManualResetEvent类
命名空间:System.Threading
ManualResetEvent类的继承结构,事件是一个系统范围内的资源同步方法。为了从托管代码中使用系统事件,.Net FrameWorkd在System.Threading中定义了ManualResetEvent事件。
可以使用事件通知其他任务:这里有一些数据,并完成了一些操作。事件可以发出信号,也可以不发出信号。
Event 同步事件的一个特点:多个同步任务可以交叉运行。线程A、B同时运行,下面的图例说明运行方式
上面标有数字的,是程序运行的顺序。代码如下,例子可能不太贴切,为了
class Program
{
static ManualResetEvent manA;
static ManualResetEvent manB;
static void Main(string[] args)
{
manA = new ManualResetEvent(false);
manB = new ManualResetEvent(false);
Manager Man = new Manager("大堂经理");
Worker worker1 = new Worker("Mike");
worker1.accheck += Man.Check;
Worker worker2 = new Worker("Tom");
worker2.accheck += Man.Check;
Random ran = new Random();
Action ac1 = () =>
{
worker1.EditBill();
manB.Set();
Thread.Sleep(ran.Next(1, 10) * 1000);
manA.WaitOne();
worker1.ReCheck();
manB.Set();
manA.WaitOne();
Thread.Sleep(ran.Next(1, 10) * 1000);
worker1.CustomeConfirm();
Thread.Sleep(ran.Next(1, 10) * 1000);
manB.Set();
manA.WaitOne();
worker1.ReCheck();
Thread.Sleep(ran.Next(1, 10) * 1000);
worker1.Complete();
};
Action ac2 = () =>
{
worker2.EditBill();
manA.Set();
Thread.Sleep(ran.Next(1, 10) * 1000);
manB.WaitOne();
worker2.ReCheck();
manA.Set();
manB.WaitOne();
Thread.Sleep(ran.Next(1, 10) * 1000);
worker2.CustomeConfirm();
Thread.Sleep(ran.Next(1, 10) * 1000);
manB.Set();
manA.WaitOne();
worker2.ReCheck();
Thread.Sleep(ran.Next(1, 10) * 1000);
worker2.Complete();
};
Parallel.Invoke(ac1, ac2);
ReadLine();
}
}
public class Person
{
private string _name;
public Person(string name)
{
this._name = name;
}
public string Name { get { return this._name; } }
}
/// <summary>
/// 经理
/// </summary>
public class Manager:Person
{
public Manager(string name) : base(name)
{
}
/// <summary>
/// 审核的方法
/// </summary>
public void Check()
{
WriteLine($"{this.Name} 正在审核信息。。。");
}
}
/// <summary>
/// 员工
/// </summary>
public class Worker : Person
{
public Worker(string name) : base(name)
{
}
/// <summary>
/// 工作第一步
/// </summary>
public void EditBill()
{
WriteLine($"{this.Name} 填写单据");
}
public event Action accheck;
/// <summary>
/// 请求审核
/// </summary>
public void ReCheck()
{
WriteLine($"{this.Name} 请求审核");
if (accheck != null)
accheck();
}
/// <summary>
/// 工作第三步
/// </summary>
public void CustomeConfirm()
{
WriteLine($"{this.Name} 请求客户确认");
}
/// <summary>
/// 工作最后一步
/// </summary>
public void Complete()
{
WriteLine($"{this.Name} 完成当前任务");
}
}
为了加深自己的印象,特留做印记。如有高见,请不吝赐教。