zoukankan      html  css  js  c++  java
  • 多播委托如何异步并发执行

    应用场景需求:

          小孩叫“我饿了”,这时需要他爸爸和妈妈同时听到并同时进行处理,小孩不能等他爸妈回应后再闭嘴(他爸妈的处理不能阻塞小孩说完话后闭嘴)。

    解决方法:

          通常使用“多播异步委托”可以实现一个“观察者模式”达到大部分要求,但多播委托是顺序执行的,所以他爸妈不能同时处理。没有查找到“多播异步并发委托”的实现例子,好像委托也不支持并发执行。于是改用“异步委托列表”的方式达到“多播异步并发委托”的效果。

    代码如下:

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace 观察者模式
    {
        
    public delegate void SpeakDelegate(string speak);

        
    class Child
        {

            
    public List<SpeakDelegate> SpeakHandleList = new List<SpeakDelegate>();

            
    public void Speak(string speak)
            {
                
    foreach (SpeakDelegate SpeakHandle in this.SpeakHandleList)
                {
                    
    if (SpeakHandle != null)
                        SpeakHandle.BeginInvoke(speak, FinishListion, 
    null);
                }
            }

            
    private void FinishListion(IAsyncResult result)
            {
               
            }

        }

    }
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace 观察者模式
    {

        
    public partial class Form1 : Form
        {
            
    private delegate void UpdateUIDelegate(string text);
            
    private Child m_Child;


            
    public Form1()
            {
                InitializeComponent();
            }

            
    private void Form1_Load(object sender, EventArgs e)
            {
                
    this.m_Child = new Child();
           

                SpeakDelegate AHandle 
    = new SpeakDelegate(this.Parent_ListenA);
                
    this.m_Child.SpeakHandleList.Add(AHandle);

                SpeakDelegate BHandle 
    = new SpeakDelegate(this.Parent_ListenB);
                
    this.m_Child.SpeakHandleList.Add(BHandle);


            }

            
    private void button1_Click(object sender, EventArgs e)
            {
                
    this.AddText("开始\r\n");
                
    this.m_Child.Speak(this.textBox1.Text);
                
    this.AddText("结束\r\n");
            }

            
    public void Parent_ListenA(string speak)
            {
                
    this.AddText("  爸爸听到了,等着吧....\r\n");
                System.Threading.Thread.Sleep(
    1000);
                
    this.AddText("  爸爸回复:等会解决了这个问题给你买雪糕!\r\n");

            }

            
    public void Parent_ListenB(string speak)
            {
                
    this.AddText("  妈妈听到了,等着吧....\r\n");
                System.Threading.Thread.Sleep(
    5000);
                
    this.AddText("  妈妈回复:让你爸给你买去!\r\n");
            }

            
    private void AddText(string text)
            {
                
    if (this.InvokeRequired)
                {
                    UpdateUIDelegate d 
    = new UpdateUIDelegate(AddText);
                    
    this.Invoke(d, new object[] { text });

                }
                
    else
                {
                    
    this.textBox2.Text += DateTime.Now.ToString() + text;
                }

            }

        }
    }

     运行结果:

    从执行结果看 前两行表明了同步,三四行表明了并发。

    斗胆发在首页候选区,希望能有人提出问题的其它解决方案。

     代码

  • 相关阅读:
    C语言成长学习题(八)
    C语言成长学习题(七)
    C语言成长学习题(六)
    C语言成长学习题(五)
    Linux下zookeeper下载与安装教程
    Linux下mongoDB下载与安装
    并发容器之阻塞队列DelayQueue的使用案例及源码分析
    原子操作CAS-最小的线程安全
    ThreadLocal定义、使用案例及源码分析
    mac上使用git命令上传项目工程源码至Github/gitee
  • 原文地址:https://www.cnblogs.com/zhaobl/p/1662855.html
Copyright © 2011-2022 走看看