
前言
上位机软件开发中很多新手对于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#上位机资料

1347

被折叠的 条评论
为什么被折叠?



