⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmresetevent.cs

📁 清华大学出版社出版的 移动应用开发宝典 张大威(2008)的附书源代码
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace CodeForChapter11cs
{
  public partial class frmResetEvent : Form
  {
    public frmResetEvent()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Thread t1 = new Thread(this.AddFirstAndLast2);
      t1.Name = "Worker Thread 1 ";
      Thread t2 = new Thread(this.AddMiddle2AndMessage);
      t2.Name = "Worker Thread 2 ";

      t1.Start();
      t2.Start();
    }

    #region ManualResetEvent
    List<long> l = new List<long>(10);
    ManualResetEvent mre1 = new ManualResetEvent(false);
    ManualResetEvent mre2 = new ManualResetEvent(false);
    private void AddFirstAndLast2()
    {
      Thread.Sleep(500); //give the other one a head start, makes no difference
      Debug.WriteLine(Thread.CurrentThread.Name + " is running");
      l.Add(1);
      l.Add(2);

      // tell the other thread to do its job and wait for it to tell us
      Debug.WriteLine(Thread.CurrentThread.Name + " signals and waits");
      mre2.Set();
      mre1.WaitOne(); //blocks here
      mre1.Reset();
      Debug.WriteLine(Thread.CurrentThread.Name + " is running");

      l.Add(5);
      l.Add(6);

      Debug.WriteLine(Thread.CurrentThread.Name + " signals and waits");
      mre2.Set();
      mre1.WaitOne(); // could also have been t2.Join() if t2 is available
      mre1.Reset(); //superflouus
      Debug.WriteLine(Thread.CurrentThread.Name + " is running and ends.");
    }

    private void AddMiddle2AndMessage()
    {
      // wait for other thread to do its first set
      Debug.WriteLine(Thread.CurrentThread.Name + " about to wait");
      mre2.WaitOne(); //blocks here
      mre2.Reset();
      Debug.WriteLine(Thread.CurrentThread.Name + " is running");

      l.Add(3);
      l.Add(4);

      // tell it we are done and wait again
      Debug.WriteLine(Thread.CurrentThread.Name + " signals and waits");
      mre1.Set();
      mre2.WaitOne();
      mre2.Reset();
      Debug.WriteLine(Thread.CurrentThread.Name + " is running and breaks in debugger");

      Debugger.Break();
      Debug.WriteLine(Thread.CurrentThread.Name + " ends. You hit F5.");
      mre1.Set();
    }
    #endregion

  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -