C# 委托与事件的简单应用

看过最好的文章,是这篇C# 中的委托和事件 - Jimmy Zhang - 博客园 (cnblogs.com)

看过以后,需要自己总结使用,毕竟光说不练假把戏,记录一下

 

1. 把委托当做参数传递使用

对于具有相同参数类型,相同返回类型的方法,可以通过同一个带有委托的方法直接调用,避免用ifelse或者switch选择

public delegate int ComputeEventHandle(int x, int j); //声明委托

        private int Add(int a,int b)
        {
            return a + b;
        }

        private int Mul(int a,int b)
        {
            return a * b;
        }

        private int Sub(int a,int b)
        {
            return a - b;
        }

        private int Div(int a,int b)
        {
            if (b != 0)
            {
                return a / b;
            }
            else
            {
                return int.MinValue;
            }
        }


        private int GetResult(int a ,int b, ComputeEventHandle handle ) //传递委托
        {
            return handle(a,b);
        }


        private void button11_Click(object sender, EventArgs e)
        {
            int re = GetResult(10, 2, Add);
            Console.WriteLine(re);
            re = GetResult(10, 2, Sub);
            Console.WriteLine(re);
            re = GetResult(10, 2, Mul);
            Console.WriteLine(re);
            re = GetResult(10, 2, Div);
            Console.WriteLine(re);
        }
View Code

 

2. 通过委托异步调用

异步委托调用前面线程总结的文章已经写过,这里写个简单的

        public delegate void WaitingEventHandle(int time);

        private void Waiting(int time)
        {
            Console.WriteLine("开始");
            Thread.Sleep(time * 1000);
            Console.WriteLine("结束");
        }
        private void button12_Click(object sender, EventArgs e)
        {
            WaitingEventHandle waitingHandle = new WaitingEventHandle(Waiting);
            waitingHandle.BeginInvoke(3, null, null);
        }
View Code

 

3. 通过委托解决跨线程更改控件属性问题

        private delegate void SetTextEventHandle(Control lb, string strValue);

private void SetCaptionValue(Control cl, string text)
        {
            try
            {
                if (cl.InvokeRequired)//如果调用控件的线程和创建创建控件的线程不是同一个则为True
                {
                    while (!cl.IsHandleCreated)
                    {
                        //解决窗体关闭时出现“访问已释放句柄“的异常
                        if (cl.Disposing || cl.IsDisposed)
                            return;
                    }
                    SetTextEventHandle d = new SetTextEventHandle(SetCaptionValue);
                    cl.BeginInvoke(d, new object[] { cl, text });
                }
                else
                {
                    cl.Text = text;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
View Code

 

4. 事件的使用

在一个界面中通过事件调用另一个界面的方法

//Form1中
        public event Func<int> FlashWork;

        private async  void bt_Flash_Click(object sender, EventArgs e)
        {
            var task = Task.Run(() =>
            {
                return FlashWork();
            });
            int re = await task;
            if (re == 1)
            {
                MessageBox.Show("刷写异常,请重新刷写");
            }
        }


//Form2中
                form.FlashWork += Flash;//订阅事件,Flash是一个方法
View Code

 

posted @ 2022-03-15 17:39  寻找迷途的羔羊  阅读(210)  评论(0)    收藏  举报