正在阅读:c#多线程教学(5):Case 学习多线程c#多线程教学(5):Case 学习多线程

2005-07-13 10:22 出处: 作者:c-sharpcorner 责任编辑:moningfeng

  在这里,我增加了一个ManualResetEvent对象和ManualResetEvent的数组。

public ManualResetEvent m_mreB;

public ManualResetEvent[] m_mre_array;


  添加初始化代码:

m_mreB = new ManualResetEvent(false);

m_mre_array = new ManualResetEvent[2];

m_mre_array[0]=m_mre;

m_mre_array[1]=m_mreB;


  启动四个线程:

Thread t0 = new Thread(new ThreadStart(SafeWriteThread));

Thread t0B = new Thread(new ThreadStart(SafeWriteThreadB));

Thread t1 = new Thread(new ThreadStart(SafeReadThread10B));

Thread t2 = new Thread(new ThreadStart(SafeReadThread20B));

t0.IsBackground=true;

t0B.IsBackground=true;

t1.IsBackground=true;

t2.IsBackground=true;

t0.Start();

t0B.Start();

t1.Start();

t2.Start();


  在这里有两个StartThreads和两个WriteThreads,让我们看看他们的执行:

public void SafeWriteThread()

{
m_mre.Reset();

WriteThread();

m_mre.Set();
}

public void SafeWriteThreadB()

{
m_mreB.Reset();

m_mre.WaitOne();

Thread.Sleep(1000);

m_x+=3;

m_mreB.Set();
}


  我对第二个WriteThread使用了另外一个事件对象,为了模拟等待第一个线程完成工作。

public void SafeReadThread10B()

{
WaitHandle.WaitAll(m_mre_array);

ReadThread10();
}

public void SafeReadThread20B()

{
WaitHandle.WaitAll(m_mre_array);

ReadThread20();
}



  在这里,使用了一个WaitAll的方法,他是WaitHandle基类提供给ManualResetEvent的静态方法,它的参数为我们在前面定义的ManualResetEvent数组。他阻塞当前的线程直到参数数组里面所有的ManualResetEvent对象设置状态为signaled,换一句话说就是等待他们完成了各自的任务。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品