C#上位机项目实战——委托实战之更新界面日志

在这里插入图片描述

前言

上位机软件开发中很多新手对于C#的委托如何应用于实际项目感到困惑,本文就来讲解一种委托的实际项目应用案例,在多线程中使用委托更新界面日志,让上位机新手对委托的理解更加深刻!

1、声明委托变量并赋值

1)在主窗体类MainForm中声明一个Action类型的委托变量UpdateLogDelegate,Action关键字是C#中自定义的带有参数值但是没有返回值的委托,我们这里选择它是因为我们需要将日志信息作为参数进行传递,所以需要使用带有参数的委托,如下图。
在这里插入图片描述
2)定义委托关联的方法
由于委托实际上就是对方法的引用,所以这里定义一个方法UpdateLog,为了匹配Action,这里的方法也是将string变量作为唯一形参并且没有返回值,方法的作用是将传输的字符串变量显示到MainForm窗体的richTextBox_Log上,并且加上时间戳和换行,这里需要注意的是显示日志需要跨线程,所以使用了control.Invoke,如下图。
在这里插入图片描述

3)委托变量实例化
委托变量实例化,就是将方法名赋值给委托变量,如下图。
在这里插入图片描述
到这里委托的定义以及赋值就完成了,接下来我们就可以使用这个委托了。

2、定义自动测试类

我们这里想实现的效果是当用户点击“启动”按钮,每隔5秒显示一个日志到界面上,这里定义了一个AutoTest类,该类有一个异步Run方法,当用户点击“开始”按钮后,Run方法就开始执行,Run方法中调用了UpdateLogDelegate这个委托,这个委托是通过AutoTest类的构造函数传进来的,这个委托传递一个index变量,并且将这个变量调用ToString方法,因为委托需要传递string类型的变量,但是index是Int类型的,所以需要进行类型转换。
在这里插入图片描述

AutoTest类代码如下:

 class AutoTest : IDisposable
    {
        //public event EventHandler<AlarmEventArgs> Alarmed;
        CancellationTokenSource tokenSource;
        Task mainTask;
        Action<string> UpdateLogDelegate;
        int index = 0;
        public AutoTest(Action <string > _UpdateLogDelegate)
        {
            this.UpdateLogDelegate = _UpdateLogDelegate;
        }

        private async Task Run()
        {
            try
            {
                var token = tokenSource.Token;
                while (true)
                {
                    await Task.Delay(5000, token);
                    try
                    {
                        UpdateLogDelegate?.Invoke (index.ToString());
                        index++;
                        //Alarmed?.Invoke(this, new AlarmEventArgs("设备报警啦!"));
                    }
                    catch (Exception ex)
                    {

                    }
                    token.ThrowIfCancellationRequested();
                }
            }
            catch (OperationCanceledException)
            {
                return;
            }
            catch (Exception ex)
            {

            }
        }
        public void Start()
        {
            if (mainTask != null && !mainTask.IsCompleted)
                return;
            tokenSource = new CancellationTokenSource();
            mainTask = Task.Run(Run, tokenSource.Token);
        }

        public void Dispose()
        {
            tokenSource?.Cancel();
            tokenSource?.Dispose();
            tokenSource = null;
            mainTask = null; 
        }
    }

3、将委托变量传递到自动测试类

在MainForm类的构造函数中实例化AutoTest这个自动测试类时将事先赋值好的委托变量UpdateLogDelegate传入,当用户点击“开始”按钮btn_Run时,触发AutoTest类的Start方法,Start方法调用了AutoTest类的Run方法,这样委托就能实现日志更新了
在这里插入图片描述
日志更新效果如下:
在这里插入图片描述

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》

以上教程CSDN订阅已超过2000+~

加入文章最下方qq群即可获取更多C#上位机资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上位机马工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值