// 异步更新通用结果 private void AppendCommonSemResult(string data) { Txb_Sem_Result.Dispatcher.BeginInvoke(new Action(() => { Txb_Sem_Result.AppendText(data + "\n"); Txb_Sem_Result.ScrollToEnd(); Lbl_Produced_Cnt.Content = "" + producedCnt; })); }
// 异步更新消费者结果 private void AppendConSemResult(string data) { Txb_Sem_Result.Dispatcher.BeginInvoke(new Action(() => { lblBuffers[outIdx % BUFF_SIZE].Background = emptyBg; lblBuffers[outIdx % BUFF_SIZE].Content = INIT_CONTENT; outIdx++; Txb_Sem_Result.AppendText(data + "\n"); Txb_Sem_Result.ScrollToEnd(); Lbl_Produced_Cnt.Content = "" + producedCnt; })); }
// 异步更新生产者结果 private void AppendProSemResult(string data) { Txb_Sem_Result.Dispatcher.BeginInvoke(new Action(() => { producedCnt++; lblBuffers[inIdx % BUFF_SIZE].Background = fullBg; lblBuffers[inIdx % BUFF_SIZE].Content = FULL_CONTENT; inIdx++; Txb_Sem_Result.AppendText(data + "\n"); Txb_Sem_Result.ScrollToEnd(); Lbl_Produced_Cnt.Content = "" + producedCnt; })); }
// 开始模拟生产者消费者同步 private void Btn_Start_Sem_Click(object sender, RoutedEventArgs e) { try { CreateBufferGrid(); }catch (Exception) { MessageBox.Show("缓冲区个数应小于12且为正整数!"); return; } int producerCnt, consumerCnt; try { Txb_Sem_Result.AppendText(string.Format("缓冲区大小为{0}, 生产目标个数为{1}\n", BUFF_SIZE, TOTAL_PRODUCT)); producerCnt = int.Parse(Txb_Producer_Cnt.Text); consumerCnt = int.Parse(Txb_Consumer_Cnt.Text); empty = new Semaphore(BUFF_SIZE, BUFF_SIZE); full = new Semaphore(0, BUFF_SIZE); for (int i = 0; i < producerCnt; i++) { Thread thread = new Thread(new ParameterizedThreadStart(Produce)) { Name = "生产者" + i }; thread.Start(thread.Name); } for (int i = 0; i < consumerCnt; i++) { Thread thread = new Thread(new ParameterizedThreadStart(Consume)) { Name = "消费者" + i }; thread.Start(thread.Name); } } catch (FormatException) { MessageBox.Show("请输入正整数!"); } }