zoukankan      html  css  js  c++  java
  • C#委托、事件、线程

    这是几个简单的例子,但是实际的开发中委托还还只在反射时用到过,事件的话只自己做了一次,并且还是特意去用的 ,实际上可以不用。线程的话,因为需要,所以用的会多点,这里主要是WS上的线程。

    委托

    在前面的反射实例中,也有用到委托执行方法。

    这个例子是将一个方法或者委托实例作为另外一个函数的入参传递。

    至于有什么用,我现在还没用上。

     private delegate void Dosth(string s);//定义委托 无返回值 一个string参数
     private void button2_Click_1(object sender, EventArgs e)
      {
             
          Dosth dosth = new Dosth(Func);//实例化委托,
          DoMain(dosth);//DoMain(Func) 调用函数方法DoMain,入参可以是对应的方法Func也可以是委托实例化的后的dosth
       }
       private void Func(string s)
       {
          MessageBox.Show(s);
       }
      private void DoMain(Dosth fun) //方法DoMain 入参接收一个委托实例或者函数:返回值是空,入参是一个string
       {
          fun("hello world!");
       }

    事件

    事件使用发布-订阅模型,事件在类中申明且生成,通过使用同一个类或者其他类中的委托与事件处理程序关联。

    包含事件的类用于发布事件,被称为发布器,其他接收该事件的类称为订阅器。

    发布器中描述的是怎么调用事件,也就是触发事件,订阅器中实际是事件具体的执行,最终要做什么在订阅器中完成。

    这是一个实例。

    发布器类

    发布事件,定义触发事件执行的逻辑的设定。

     public class Publish {
            private int value;
            public delegate void MyDelegate(string s);//申明委托
            public event MyDelegate MyEvent;//基于申明的委托定义事件
            public Publish()
            {
                value = 3;
            }
            public void CompairValue(int n)
            {
                if (n == value)//满足条件
                {
                    OnValueChanged();
                }
            }
            protected void OnValueChanged()
            {
                if (MyEvent != null)
                {
                    MyEvent("hello world!");//触发订阅器中的方法执行
                }
            }
        }

    订阅器类

    被触发时,做该做的事。

     public class Subscribe
        {
            public void ShowMessage(string s)
            {
                MessageBox.Show(s);//事件触发,订阅器中执行指定操作,更多的的操作可以在这个类中完成
            }
        }

     触发器

    private void button3_Click(object sender, EventArgs e)
    {
         Publish pub = new Publish();
         Subscribe sub = new Subscribe();
         pub.MyEvent += sub.ShowMessage;//或者new Publish.MyDelegate(sub.ShowMessage);   把订阅器中的方法绑定到事件上,也就是注册发布器中的事件
         pub.CompairValue(3);//当入参为3时,触发事件,订阅器中的方法则执行
    }

    线程 

    这里的线程是WS上的线程

    public void DoMain(){
    static
    object ThreadLock = new object(); public static Thread thread; lock (ThreadLock) { try { Boolean ThreadIsExit = thread.IsAlive;//如果报错说明线程不存在 if (!ThreadIsExit) { thread.Start(); } } catch {try { thread = new Thread(new ThreadStart(Dosth));//开启一个线程,回调函数Dosth thread.IsBackground = true;//设置线程为后台线程 thread.Start(); } catch (Exception ex) { } finally { } } finally { } }

    }
    public void Dosth(){


    }
  • 相关阅读:
    windows照样命令行gcc/g++
    我的Linux(Ubuntu)首秀
    简单分频原理与实现——计数器
    时序分析之Arrival Time
    DDS正弦信号发生器
    C/C++ 预处理器
    时序分析之Slack
    iOS单例
    static
    深浅拷贝
  • 原文地址:https://www.cnblogs.com/zyskr/p/10751769.html
Copyright © 2011-2022 走看看