C# 委托 事件 多线程

359 阅读2分钟

委托

delegate是存有对某个方法的引用的一种引用变量,引用可在运行时改变。委托特别用于实现事件和回调方法。

// 定义委托
修饰符  delegate  返回值类型  委托名 ( 参数列表 );

// 定义匿名委托
委托名  委托对象 = delegate
{
    //代码块
};

// 调用匿名委托
委托对象名 ( 参数列表 );
多播委托
  • 多播委托是指在一个委托中注册多个方法,在注册方法时可以在委托中使用加号运算符或者减号运算符来实现添加或撤销方法。
class Program
{
    //定义购买商品委托
    public delegate void OrderDelegate();
    static void Main(string[] args)
    {
        //实例化委托
        OrderDelegate orderDelegate = new OrderDelegate(Order.BuyFood);
        //向委托中注册方法
        orderDelegate += Order.BuyCake;
        //调用委托
        orderDelegate();
    }
}
class Order
{
    public static void BuyFood()
    {
        Console.WriteLine("购买快餐!");
    }
    public static void BuyCake()
    {
        Console.WriteLine("购买蛋糕!");
    }
}
匿名委托
  • 匿名委托通常适用于实现一些仅需要使用一次委托中代码的情况,并且代码比较少
class Program
{
    public delegate void AreaDelegate(double length, double width);
    static void Main(string[] args)
    {
        Console.WriteLine("请输入长方形的长:");
        double length = double.Parse(Console.ReadLine());
        Console.WriteLine("请输入长方形的宽:");
        double width = double.Parse(Console.ReadLine());
        AreaDelegate areaDelegate = delegate
        {
            Console.WriteLine("长方形的面积为:" + length * width);
        };
        areaDelegate.Invoke(length,width);
        areaDelegate(length, width);
    }
}

事件

// 定义事件
访问修饰符  event  委托名  事件名 ;
class Program
{
    static void Main(string[] args)
    {
        //创建MyEvent类的实例
        MyEvent myEvent = new MyEvent();
        
        //实例化事件,使用委托指向处理方法
        myEvent.BuyEvent += new MyEvent.BuyDelegate(MyEvent.BuyFood);
        myEvent.BuyEvent += new MyEvent.BuyDelegate(MyEvent.BuyCake);

        //调用触发事件的方法
        myEvent.InvokeEvent();
    }
}
class MyEvent
{
    //定义委托
    public delegate void BuyDelegate();
    //定义事件
    public event BuyDelegate BuyEvent;
    
    //定义委托中使用的方法
    public static void BuyFood()
    {
        Console.WriteLine("购买快餐!");
    }
    public static void BuyCake()
    {
        Console.WriteLine("购买蛋糕!");
    }

    //创建触发事件的方法
    public void InvokeEvent()
    {
        //触发事件,必须和事件是同名方法
        BuyEvent();
    }
}

多线程

进程与线程

每运行一个程序都会开启一个进程,一个进程由多个线程构成。 线程是程序执行流中最小的单元。

class Program
{
    static Thread thread;
    static Thread thread2;
    static void Main(string[] args)
    {
        thread = new Thread(new ThreadStart(MyThreadMethod));
        //thread = new Thread(delegate (object o)
        //{
        //    MyThreadMethod(o);
        //});
        thread.Start();//开启线程
        thread.Join();//阻止当前主线程调用
        thread.Abort();//终止线程

        thread2 = new Thread(new ParameterizedThreadStart(MyThreadMethod2));
        thread2.Start("123");


        // Task类创建线程
        Task task = new Task(delegate ()
        {
            Console.WriteLine("task 创建线程");
        });
        task.Start();//开启线程

        //TaskFactory线程工厂
        Task.Factory.StartNew(delegate ()
        {
            Console.WriteLine("TaskFactory线程工厂 创建线程");
        });


        //线程池
        CountdownEvent cd = new CountdownEvent(20);

        ThreadPool.SetMinThreads(2, 2);
        ThreadPool.SetMaxThreads(2, 2);
        for (int i = 0; i < 20; i++)
        {
            ThreadPool.QueueUserWorkItem(delegate (object o)
            {
                Thread.Sleep(2000);//等待2s
                Console.WriteLine("Quene the task");
                cd.Signal();
            });
        }
        cd.Wait();
        cd.Dispose();
        Console.WriteLine("主线程结束");
        Console.ReadKey();
    }
    private static void MyThreadMethod()
    {
        ThreadState threadState = thread.ThreadState;
        Console.WriteLine("---线程已经执行---");
        Console.WriteLine(threadState);
    }
    private static void MyThreadMethod2(object obj)
    {
        Console.WriteLine(obj);
    }

}