如题,WinForm 和 Windows Service 通信,就是应用程序和系统服务通信,可以看成是进程间的通信。通信的方式有很多,这里只介绍通过消息队列(MessageQueue)方式。理论知识就不介绍了,直接介绍实例吧。
一、建立工程
建立3个项目,其中,
Common 为类库,包含错误日志类(Log.cs)和数据库访问类(MsSql.cs)
ServiceDemo 为Windows Service服务,包含安装类(Installer1.cs)和服务类(Service1.cs)
ServiceDesk 为WinForm应用程序,包含一个主窗口类(frmMain.cs)
这3个项目要实现的功能是,进程间通信,具体怎么通信呢?这里我设计的是用ServiceDesk这个WinForm实时监控ServiceDemo这个系统服务。ServiceDesk和ServiceDemo之间的通信就通过消息队列(MessageQueue)方式。
对了,补充下理论,消息队列必须安装后才能用,安装步骤如下:
控制面板->添加或删除程序->添加或删除组件
选择应用程序服务器详细信息
勾上消息队列
安装完就可以通过控制面板->管理工具->计算机管理->服务和应用程序访问了
二、书写服务
Service1.cs
public partial class Service1 : ServiceBase
{
Thread m_thread1;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
if (m_thread1 != null && m_thread1.ThreadState != System.Threading.ThreadState.Aborted)
{
m_thread1.Abort();
}
m_thread1 = new Thread(new ThreadStart(Work));
m_thread1.IsBackground = true;
m_thread1.Start();
}
protected override void OnStop()
{
}
private void Work()
{
while (true)
{
//try
//{
// string sql = "insert into T_Log(DateTime,Description)values({0},{1})";
// sql = String.Format(sql, DateTime.Now.ToString(), "adsf");
// int Result = Common.MsSql.ExecuteNonQuery(sql, this.GetType());
//}
//catch (Exception e)
//{
// Common.Log.Write(e);
//}
string msg = "消息内容测试";
SendMessage(msg);
System.Threading.Thread.Sleep(500);
}
}
void SendMessage(string msg)
{
try
{
string QueuePath = "./private$/aaaa";
MessageQueue MQueue;
if (!MessageQueue.Exists(QueuePath))
{
return;
}
MQueue = new MessageQueue(QueuePath);
System.Messaging.Message Msg = new System.Messaging.Message();
Msg.Body = msg;
//XML格式化传输量较大
//Msg.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
Msg.Formatter = new System.Messaging.Binary