using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace QueueCs { public partial class Form1 : Form { BackgroundWorker[] bw = new BackgroundWorker[4]; // 从队列中取数据的线程 BackgroundWorker eq = new BackgroundWorker(); // 往队列中放数据的线程 Queue<string> q = new Queue<string>(); // 队列 Random r=new Random(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) // 初始化线程 { eq.WorkerSupportsCancellation = true; eq.WorkerReportsProgress = true; eq.DoWork += new DoWorkEventHandler(eq_DoWork); eq.ProgressChanged += new ProgressChangedEventHandler(eq_ProgressChanged); for (int i = 0; i < 4; i++) { bw[i] = new BackgroundWorker(); bw[i].WorkerReportsProgress = true; bw[i].WorkerSupportsCancellation = true; bw[i].DoWork += new DoWorkEventHandler(bw_DoWork); bw[i].ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); } } private void button1_Click(object sender, EventArgs e) // 开始运行测试 { if (!eq.IsBusy) { listBox1.Items.Clear(); // 清除列表框 listBox2.Items.Clear(); listBox3.Items.Clear(); listBox4.Items.Clear(); q.Clear(); // 清除队列 eq.RunWorkerAsync(); // 启动线程,往队列中放数据 for (int i = 0; i < 4; i++) { bw[i].RunWorkerAsync(); // 启动从队列中取数据的线程 } } } private void button2_Click(object sender, EventArgs e) // 停止测试 { eq.CancelAsync(); for (int i = 0; i < 4; i++) { bw[i].CancelAsync(); } } void bw_DoWork(object sender, DoWorkEventArgs e) // 不停的从队列中取出数据 { BackgroundWorker b = sender as BackgroundWorker; while (!b.CancellationPending) { if (q.Count > 0) // 队列中有数据吗? { int n = int.Parse(q.Dequeue()); // 取出数据 b.ReportProgress(1, n); // 显示取出的数据 } Thread.Sleep(r.Next(20,30)); } } void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { BackgroundWorker b = sender as BackgroundWorker; int n=(int)e.UserState; // 取出数据并显示到对应的列表框中 if (b.Equals(bw[0])) { listBox1.Items.Add(n); } else if (b.Equals(bw[1])) { listBox2.Items.Add(n); } else if (b.Equals(bw[2])) { listBox3.Items.Add(n); } else if (b.Equals(bw[3])) { listBox4.Items.Add(n); } } void eq_DoWork(object sender, DoWorkEventArgs e) // 不停的往队列中放入数据 { int i = 1; while (!eq.CancellationPending) { q.Enqueue(i.ToString()); eq.ReportProgress(1, i); // 显示队列中的情况 Thread.Sleep(1); ++i; } } void eq_ProgressChanged(object sender, ProgressChangedEventArgs e) { label1.Text = ((int)e.UserState).ToString() + " 入队,队中数据共有:" + q.Count.ToString(); } } }