由于项目的需要,最近几天一直在做串口和数据库。由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textbox作显示,但是明明非常简单的代码,在编译的时候总是提示有错误。后来查看网上资料,才知道C#还有委托,匿名等等之类的新东西。下面我就把我这几天的经验和大家分享一下。这次就主要说说委托和匿名方法,以后在说说串口使用方面的经验。
先说一下委托的基本概念,委托是一种引用型的数据类型,其实它的概念和C语言的函数指针几乎是一样的。回忆一下C语言的函数指针,定义一个函数指针,需要指定形参的类型和返回值的类型,只要有函数的形参类型和返回类型和这个函数指针一致,那么该函数指针就可以指向这个函数。C语言学习中一定会提高一个四则运算的例子,就是利用函数指针。
C#中委托的申明如下
【访问修饰符】 delegate
返回值类型
委托名(【参数列表】);
委托虽然是一种数据格式,但是却需要像类一下去实例化。所以委托的实例化如下
委托类型
委托变量名 = new
委托型构造函数(委托要引用的方法名)
实例化过后就可以使用命名方法和匿名方法两种方法,来来指定这个委托的函数引用。
废话少说,还是来一个实例吧。比如说,在主线程之外开辟一个线程,这个线程使用主线程的一个label控件,显示当前的时间。由于新开的线程要使用其他线程开的控件,所以需要使用到control类型的Invoke方法,而这个方法传入正是delegate类型。
先来看一个“想当然”的代码。
private
void showDateTimeMethod()
{
while (true)
{
//显示当前时间
label1.Text =
"当前时间 "
+ DateTime.Now.ToString();
//线程暂停
Thread.Sleep(1000);
}
}
private
void Form1_Load(object
sender, EventArgs
e)
{
//新建一个线程
Thread
showDateTimethread =
new Thread(new
ThreadStart(showDateTimeMethod));
//该线程为后台线程
showDateTimethread.IsBackground =
true;
//线程启动
showDateTimethread.Start();
}
用我的大腿想想,上面的代码应该是对的,但是由于net苛刻的安全机制,showDateTimeMethod中的代码是有错误的。为了解决这个错误可以声明一个委托类型,实例化一个委托变量(这话听起来很拗口),并给这个委托变量指定函数引用。
方法一,使用命名方法
//声明一个委托类型,该委托类型无输入参数和输出参数
public
delegate void
ProcessDelegate();
//函数引用,label控件显示当前时间,输入参数无,输出参数无,和声明的委托类型形式一致
public
void LabelShow()
{
label1.Text =
"当前时间 "
+ DateTime.Now.ToString();
}
然后在线程中实例化一个委托变量,指向这个函数引用。
while (true)
{
//使用命名方法
ProcessDelegate
showProcess = new
ProcessDelegate(LabelShow);
//调用label的invoke方法
label1.Invoke(showProcess);
//线程暂停
Thread.Sleep(1000);
}
这样的话就可以在窗体中看到当前的时间了。
方法二,使用匿名方法
刚刚的函数引用只有区区一行,这一行完全可以使用匿名方法实现,如果使用匿名方法的话就可以免去编写一个函数,代码显得非常简洁。
匿名方法使用方法也很简单。
委托类型
委托变量 = delegate
(【参数列表】){代码块};
while (true)
{
//实例化一个委托变量,使用匿名方法构造
ProcessDelegate
showProcess = delegate()
{
label1.Text =
"当前时间 "
+ DateTime.Now.ToString();
};
label1.Invoke(showProcess);
//线程暂停
Thread.Sleep(1000);
}
方法三,使用MethodInvoker
再观察一下上面的代码,这个委托类型,输入参数无输出参数也无,就可以使用C#的MethodInvoker直接构造,关于MethodInvoker,MSDN给出这样一个解释“表示一个委托,该委托可执行托管代码中声明为
void 且不接受任何参数的任何方法”
//使用匿名方法2
while (true)
{
label1.Invoke
(
//委托,托管无参数的任何方法
new
MethodInvoker
(
delegate
{
label1.Text =
"当前时间 "
+ DateTime.Now.ToString();
}
)
);
//线程暂停
Thread.Sleep(1000);
}
如果熟悉了C#的委托和匿名方法之后,那么在使用串口控件的时候就方便了很多。但是解决了旧的问题,新的问题也会到来。如果串口获得的数据很多,直接在接收的时候处理的话很难保证实时性,代码也变得很臃肿不堪。通过查阅网上的资料,想尝试使用异步的方法处理问题,即串口接收事件只负责接收数据,并把数据放入队列中一个线程每隔一段时间处理线程的内容,然后把整理好的数据放入数据库中。不过这要下次再说了啊。
分享到:
相关推荐
行业分析报告
Skeleton-Low Poly 低多边形骨架模型Unity插件美术资源包unitypackage 支持Unity版本2019.4.29或更高 直接的低多边形骨架。 特点: - 低多边形(9k tris,8.5) - 适用于 Unity 5 及更高 版本 - 完全装配 - 包括一个 fbx 格式的模型 - PBR 纹理 - 高清纹理
本项目是基于Java的Swing飞机订票系统设计源码,包含102个文件,其中主要包含41个java源代码文件,26个png图片文件,10个jpg图片文件等。系统采用了Java编程语言,实现了基于Swing的飞机订票系统。项目结构清晰,代码可读性强,易于理解和维护。
行业分析报告
引言 年度工作回顾 系统进展与亮点 技术创新与应用 市场反馈与用户评价 存在问题与挑战 未来展望与计划 结束语与感谢 一、引言 简要介绍智能家居系统的重要性和发展趋势 回顾本年度的工作目标和重点 二、年度工作回顾 系统建设与维护 完成的项目与里程碑 系统稳定性与可靠性提升 团队建设与培训 团队成员构成与职责 培训与技能提升活动 合作伙伴与资源整合 与供应商、合作伙伴的合作情况 资源整合与利用 三、系统进展与亮点 功能扩展与优化 新增功能介绍与效果评估 现有功能的优化与改进 用户体验提升 界面设计与交互优化 用户反馈与改进措施 四、技术创新与应用 物联网技术的应用 传感器与通信技术的升级 大数据分析与应用 智能家居的智能化管理 自动化控制与节能策略 安全防护与预警系统 五、市场反馈与用户评价 市场反馈分析 市场需求与竞争态势 市场占有率与增长趋势 用户评价总结 用户满意度调查结果
行业分析报告
2024-2030全球及中国PCB接触式探头行业研究及十五五规划分析报告
行业分析报告
行业分析报告
1094.基于51单片机的电动自行车调速系统的设计.doc
基于ssm+vue家政公司服务平台源码数据库文档.zip
hadoop大数据开发
单片机设计文档DOC智能循迹避障小车_论文设计提取方式是百度网盘分享地址
云南省移动应用大赛模板.zip
六数码问题解决方法 可类比到八数码 一个小小的六数码问题求
基于YOLOv的目标检测算法研究.docx目录
智慧医院的设计要遵从顶层设计的方法论,在整个顶层框架设计时遵从自上而下的原则,在实现步骤设计时采用自下而上的方式,按照顶层设计的原则、方法和关键点,结合传统的医院智能化系统的设计方法,形成一套完善的新型国际化智慧医院设计思路。本项目遵循“结构合理、系统稳定、适当冗余、适度超前”的设计理念,设计体现渐进性(留有扩展余地、可分步实施)。 智慧医院并不是智能化各个子系统的简单累加,是凭借丰富的医院行业知识和工程实践经验,为项目提供全生命周期的咨询顾问服务,包括顶层规划、系统设计、系统集成、技术咨询、造价咨询、项目施工、后期运维等内容的一体化咨询服务体系,智慧医院是有灵魂、有亮点、人性化、易运营、高性价比。
行业分析报告
2024年核电涂料行业分析报告.pptx
行业分析报告