一、用C#开发上位机软件界面,要实时显示一些消息,报警、错误信息到UI界面以及保存为log日志到本地。针对这个功能,写一个消息处理的帮助类,在Winform界面中,调用这个类的方法,将信息传到UI显示。
二、以下是消息处理类代码:
namespace WindowsFormsApplication1
{
/// <summary>
/// 消息处理类
/// </summary>
public class MessageHelper
{
public MessageHelper()
{
MessageQueue = new Queue<MessageModel>();
}
private Queue<MessageModel> MessageQueue;
//方法1:定义Action的委托
public Action<MessageModel> MessageMonitor; //Action() ,Action<T>()是一类特殊的委托:有特定个数输入输出的方法
//方法2:自定义的事件委托
public delegate void messageMonitorDelegate(MessageModel qm); //委托:有相同输入输出的一类方法
public event messageMonitorDelegate MessageMonitoor_Event; //事件委托:可以把方法定义为参数来传递,利于实现封装,跨线程
/// <summary>
/// 通过委托将消息传递到UI线程
/// </summary>
/// <param name="m"></param>
public void AddMessageToUI(MessageModel m)
{
Task.Factory.StartNew(new Action(() => {
MessageQueue.Enqueue(m); //通过队列结构传递消息,利于后续封装、扩展
MessageModel message = MessageQueue.Dequeue();
//MessageMonitor?.Invoke(message); //1.触发
MessageMonitoor_Event(message); //2.触发事件
}));
}
}
/// <summary>
/// 静态类
/// </summary>
public static class MessageQueueHandle
{
//扩展方法
public static string MessageQueueToString(this MessageModel q)
{
var str = q;
return str.ID.ToString() + str.MessageLevel + str.Time + str.Content;
}
}
/// <summary>
/// 消息类
/// </summary>
public class MessageModel
{
public int ID { get; set; }
public string Content { get; set; }
public DateTime Time { get; set; }
public Level MessageLevel { get; set; }
}
public enum Level
{
info,warn,error
}
}
三、以下是UI调用代码和效果:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public MessageHelper messageHelper = new MessageHelper();
public int index = 0;
private void Form1_Load(object sender, EventArgs e)
{
//1.
//messageHelper.MessageMonitor += MessageHandle_Event;
//2.
messageHelper.MessageMonitoor_Event += MessageHandle_Event;
}
private void MessageHandle_Event(MessageModel m)
{
this.Invoke(new Action(() =>
{
this.richTextBox1.Text += MessageQueueHandle.MessageQueueToString(m)+"\n";
}));
}
/// <summary>
/// 消息触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
messageHelper.AddMessageToUI(new MessageModel
{
ID = index++,
Time = DateTime.Now,
MessageLevel = Level.info,
Content = "aaaaa"
});
}
/// <summary>
/// 报警触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
messageHelper.AddMessageToUI(new MessageModel
{
ID = index++,
Time = DateTime.Now,
MessageLevel = Level.warn,
Content = "bbbbb"
});
}
/// <summary>
/// 错误触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
messageHelper.AddMessageToUI(new MessageModel
{
ID = index++,
Time = DateTime.Now,
MessageLevel = Level.error,
Content = "ccccc"
});
}
}
}
四、总结:
上述例子:1.通过事件委托将消息传到UI界面显示 2.通过队列的形式传递消息,方便后续扩展功能 3.在上述代码的基础上增加将消息保存为log日志的功能,比较方便。