委托委托,谁委托谁?

网友投稿 631 2022-12-02

委托委托,谁委托谁?

委托委托,谁委托谁?

真绕啊。

话说,我有个窗体程序,运行着一个线程,线程里各种操作。操作过程中,各种提示、 相关信息需要记录到日志,同时也要输出到窗体上,好让人一目了然。

这部分的信息处理工作,我放在一个专门的类里完成。姑且叫做日志类吧。这个日志类的正职,是将信息记录到日志文件。现在,还要输出到窗体,怎么办呢?如果直接在这个类里操作窗体对象,就破坏了这个类的封闭,又增加了耦合。如果是对象注入吧,可能也是个办法,但我总觉得不是很好。今天输出到窗体,你新增一个对象;明天要记录到数据库呢,是不是又要增加个啥?

用委托啊。

代码

//线程中调用日志类Logger.Instance.Info($@"第 {iCycle} 轮开始 ……");

//窗体public partial class Form1 : Form{ ShowInfo si; public Form1() { InitializeComponent(); si = new ShowInfo((Form)this,rtb1, 20);//rtb1是一个富文本控件 Logger.Instance.ShowMsg += si.ShowText;//注册委托 }}//窗体输出信息类public class ShowInfo{ Form form; RichTextBox _rtb;//富文本控件,用于在窗体上展示信息 int _rowsLimit; public ShowInfo(Form form,RichTextBox rtb,int rowsLimit = 20) { this.form = form; this._rtb = rtb; this._rtb.BackColor = System.Drawing.SystemColors.ControlText;//背景色为黑色 this._rtb.ForeColor = System.Drawing.Color.Lime;//前景色即文字颜色为蓝绿色 this._rowsLimit = rowsLimit; } public void ShowText(string mess) {//本方法支持多线程 if (_rtb.InvokeRequired) {// 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它 Action dlg = (x) => { showText((object)mess); }; _rtb.Invoke(dlg, mess); } else { showText((object)mess); } } long _rows = 0; void showText(object objmess) { string mess = objmess.ToString(); if (_rows < _rowsLimit) { _rows++; _rtb.Text += mess + "\r\n"; } else { _rows = 0; _rtb.Text = mess + "\r\n"; } _rtb.SelectionStart = _rtb.Text.Length; _rtb.ScrollToCaret(); }}

运行结果

日志文件:

窗体:

上面这个委托,现在说起来,思路非常清晰,看上去应该是很自然就能想到的,但当时却想了好一阵子才理清头绪。现在对委托的理解又深了一些。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:获取网络时间
下一篇:c#中的引用问题1
相关文章

 发表评论

暂时没有评论,来抢沙发吧~